1

私は C 用のコンパイルにあまり詳しくないので、十分な情報を提供できない場合は、何を投稿する必要があるか教えてください。

要約は次のとおりです。少し古い IBM AIX コンピューターで、C のターゲット言語で ANTLR を実行する必要があります。IBM CC/make utils でのコンパイルをすぐにあきらめ、マシン上に gcc (4.2) と GNU make のバージョンを入手しました。問題は、configure スクリプトが正しいアーキテクチャを検出する一方で、適切に応答しないように見えることです。

私が使用している ANTLR の特定のバージョンは、バージョン 3.2、C ターゲットです。実際に検出されたターゲットは powerpc-ibm-aix-5.3.0.0 です

これが私がやったことです。私が目にする最初の明白なエラーは、オプションに「-m32」フラグが追加されたことです。OK、makefile からそれを簡単に削除できます。この場合、gcc はデフォルトで -maix32 になります。

2 番目の問題: stdio.h へのパスが示され、「エラー: 'unsigned' が重複しています」というエラーが表示されます。さて、自動生成された antlr3config.h ファイルで configure が "define" ステートメントを作成しました...それをコメントアウトすると、エラーは消えます。

3番目の問題...これが私が立ち往生している場所です。

/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ファイルへのリンクは次のとおりです。

ああ、Ubuntu や Cygwin などの他のプラットフォームでコンパイルできます (ただし、このタスクには使用できません)。ただし、私は AIX にあまり詳しくなく、C プログラムのコンパイルの経験も限られています。おそらく、configure スクリプトで何かを設定する必要がありますか?

ありがとう!

編集: 進捗があったため、この投稿を更新して情報をまとめます。

上記のエラーは、configure スクリプトの実行時に --disable-abiflags オプションを追加することで解決できました... このオプションは -m32 および -m64 gcc フラグを削除します。これにより、configure スクリプトが正しく機能するようになりましたが、make の実行時にアセンブラーが少し混乱しました。ガイダンスを与えるために、Makefile の CFLAFS に -Wa,-a32 フラグを追加して、32 ビットが必要であることをアセンブラーに知らせました。

残った問題は1つだけでした。

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 OBJECT_MODE=32

echo $OBJECT_MODE と入力すると、実際に 32 が出力されます... しかし、make を実行しても検出されないようです。

「libtool」スクリプトを編集して「-X 32」をarオプションに追加し、読み取っているものを上書きすることで、これを回避できました。長期的な解決策は、おそらく ltmain.sh を実行して configure を再実行することです。

4

1 に答える 1

1

これは問題の行です:

typedef socklen_t ANTLR3_SALENT;

socklen_tは定義されていないためtypedefsocket.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
于 2013-04-08T21:28:22.080 に答える