为 AIX 编译 ANTLR 3C

标签 c gcc antlr3 aix

我不太熟悉 C 语言的编译,所以如果我没有提供足够的信息,请让我知道您需要我发布什么!

总结如下:我需要在一台有点旧的 IBM AIX 计算机上以 C 的目标语言运行 ANTLR。我很快放弃了使用 IBM CC/make utils 进行编译,并在机器上安装了 gcc (4.2) 和 GNU make 版本。问题是,虽然配置脚本确实检测到正确的架构,但它似乎没有做出适当的响应。

我使用的ANTLR具体版本是3.2版,C目标。实际检测到的目标是powerpc-ibm-aix-5.3.0.0

这是我所做的。我看到的第一个明显错误是它在选项中添加了“-m32”标志。好的,我可以很简单地从 makefile 中删除它,在这种情况下 gcc 应该默认为 -maix32。

第二个问题:我收到一条错误消息,给出了 stdio.h 的路径并提示“错误:重复‘unsigned’”。好的,所以配置在自动生成的 antlr3config.h 文件中做了一个“定义”语句……我可以注释掉它,错误就消失了。

第三个问题...这是我卡住的地方。

/opt/freeware/bin/make  all-am
make[1]: Entering directory `/scrubber/libantlr3c-3.2'
if /bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -Iinclude    -O2  -Wall -MT antlr3baserecognizer.lo -MD -MP -MF ".deps/antlr3baserecognizer.Tpo" -c -o antlr3baserecognizer.lo `test -f 'src/antlr3baserecognizer.c' || echo './'`src/antlr3baserecognizer.c; \
then mv -f ".deps/antlr3baserecognizer.Tpo" ".deps/antlr3baserecognizer.Plo"; else rm -f ".deps/antlr3baserecognizer.Tpo"; exit 1; fi
gcc -DHAVE_CONFIG_H -I. -I. -I. -Iinclude -O2 -Wall -MT antlr3baserecognizer.lo -MD -MP -MF .deps/antlr3baserecognizer.Tpo -c src/antlr3baserecognizer.c -o antlr3baserecognizer.o
In file included from include/antlr3baserecognizer.h:39,
             from src/antlr3baserecognizer.c:9:
include/antlr3defs.h:343: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ANTLR3_SALENT'
make[1]: *** [antlr3baserecognizer.lo] Error 1
make[1]: Leaving directory `/scrubber/libantlr3c-3.2'
make: *** [all] Error 2

这是指向 ANTLR 库中包含的特定 antlr3defs.c 文件的链接:https://docs.google.com/file/d/0B9XS1f8YfyB4cFJRZTdWM1pMWWs/edit?usp=sharing

哦,我可以在其他平台上编译它,比如 Ubuntu 或 Cygwin(虽然我不能将它们用于此任务)。不过,我对 AIX 并不十分熟悉,并且在编译 C 程序方面经验有限。也许我需要用配置脚本设置一些东西?

谢谢!

编辑:取得了进展,因此更新这篇文章以将信息放在一起。

我能够通过在运行配置脚本时添加 --disable-abiflags 选项来解决上述错误...此选项删除 -m32 和 -m64 gcc 标志。它允许 configure 脚本正常工作,但在运行 make 时让汇编器有点困惑。为了给它提供指导,我在 Makefile 中向 CFLAFS 添加了 -Wa,-a32 标志,从而让汇编器知道我想要 32 位。

只剩下一期了。

ar cru .libs/libantlr3c.a  antlr3baserecognizer.o antlr3basetree.o antlr3basetreeadaptor.o antlr3bitset.o antlr3collections.o antlr3commontoken.o antlr3commontree.o antlr3commontreeadaptor.o antlr3commontreenodestream.o antlr3convertutf.o antlr3cyclicdfa.o antlr3debughandlers.o antlr3encodings.o antlr3exception.o antlr3filestream.o antlr3inputstream.o antlr3intstream.o antlr3lexer.o antlr3parser.o antlr3rewritestreams.o antlr3string.o antlr3stringstream.o antlr3tokenstream.o antlr3treeparser.o antlr3ucs2inputstream.o
ar: 0707-128 The OBJECT_MODE environment variable has an invalid setting.
    OBJECT_MODE must be 32, 64, 32_64, d64 or any.
make[1]: *** [libantlr3c.la] Error 1

问题是,我将其设置为什么并不重要。我试过在没有设置的情况下运行 make,然后使用 export 来设置它:

export OBJECT_MODE=32

我可以输入 echo $OBJECT_MODE,它确实会打印出 32... 但是当我运行 make 时它似乎没有检测到它。

我能够通过编辑“libtool”脚本来解决这个问题,将“-X 32”添加到 ar 选项以覆盖它正在读取的任何内容。长期解决方案可能是 ltmain.sh 并重新运行配置。

最佳答案

这是有问题的行:

typedef socklen_t ANTLR3_SALENT;

因为 socklen_t 没有定义你不能 typedef 它,包括 socket.h 应该修复它

#include <sys/socket.h>

编辑: 再次查看该文件后,如果您运行配置脚本,应该包含 socket.h

#ifdef HAVE_SOCKET_H
# include   <socket.h>
#else
# if HAVE_SYS_SOCKET_H
#  include  <sys/socket.h>
# endif
#endif

关于为 AIX 编译 ANTLR 3C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888992/

相关文章:

c - GSM PDU 解码算法行为异常

java - 提取特定规则或标记前的隐藏评论内容(Antlr、Java)

parsing - Antlr:如果重复列表,我可以以不同的方式重写树吗

java - DFA 预测和范围

c - 多终端多用户应用

c - 为什么会出现访问冲突错误?

c - while(1) 循环减少 cpu 不休眠

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

使用 GCC 交叉编译 C 应用程序

GCC 修改/自定义目标,在 x86-64 上具有自定义调用约定