为AIX编译ANTLR 3C

时间:2013-04-08 21:07:04

标签: 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的路径,并说“错误:重复'无符号'”。好的,所以configure在自动生成的antlr3config.h文件中创建了一个“define”语句......我可以将其注释掉,然后错误消失。

第三个问题......这就是我被困住的地方。

/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程序的经验也很有限。也许我需要用configure脚本设置一些东西?

谢谢!

编辑:取得进展,所以更新这篇文章以保持信息在一起。

我能够通过在运行configure脚本时添加--disable-abiflags选项来解决上述错误...此选项会删除-m32和-m64 gcc标志。它允许配置脚本正常工作,但在运行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运行make,然后使用export来设置它:

export OBJECT_MODE=32

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

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

1 个答案:

答案 0 :(得分:1)

这是有问题的一行:

typedef socklen_t ANTLR3_SALENT;

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

#include <sys/socket.h>

编辑: 在第二次查看文件后,如果运行configure脚本

,则应包括socket.h
#ifdef HAVE_SOCKET_H
# include   <socket.h>
#else
# if HAVE_SYS_SOCKET_H
#  include  <sys/socket.h>
# endif
#endif