2

私は、expat ベースのサンプル プログラムをコンパイルするのにかなりの時間を費やしました。

コンパイルしようとすると、次のエラー メッセージが表示されました。

gcc -Wall -lexpat line.c -o blah 
line.c: In function ‘main’:
line.c:99:8: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘XML_Size’ [-Wformat]
/tmp/ccUa3vfD.o: In function `printcurrent':
line.c:(.text+0x42): undefined reference to `XML_SetDefaultHandler'
line.c:(.text+0x4d): undefined reference to `XML_DefaultCurrent'
line.c:(.text+0x60): undefined reference to `XML_SetDefaultHandler'
/tmp/ccUa3vfD.o: In function `main':
line.c:(.text+0x162): undefined reference to `XML_ParserCreate'
line.c:(.text+0x1ad): undefined reference to `XML_UseParserAsHandlerArg'
line.c:(.text+0x1c9): undefined reference to `XML_SetElementHandler'
line.c:(.text+0x1dd): undefined reference to `XML_SetCharacterDataHandler'
line.c:(.text+0x1f1): undefined reference to `XML_SetProcessingInstructionHandler'
line.c:(.text+0x2b2): undefined reference to `XML_Parse'
line.c:(.text+0x2c2): undefined reference to `XML_GetErrorCode'
line.c:(.text+0x2ca): undefined reference to `XML_ErrorString'
line.c:(.text+0x2d8): undefined reference to `XML_GetCurrentLineNumber'
collect2: ld returned 1 exit status

私はすでに次のコマンドを実行していました: sudo apt-get install expat libexpat1 libexpat1-dev libxmltok1-dev

それで、エラーメッセージを消して、この(単純な)小さなプログラムをコンパイルできるようにしようと、何年もいじりましたが、役に立ちませんでした。

最終的に、まったくのランダム性から、仮想端末に切り替えることにしました。

まったく同じコマンドを実行しましたが、今回は問題なく動作しました。

これがなぜなのか誰か教えてもらえますか?ライブラリ パスを更新するために実行する必要があるものはありますか?

4

1 に答える 1

4

リンカー行 (つまり、指定するフラグ-lと入力ファイル名) は順序に依存します。ライブラリは、左側で使用される関数を定義するためにのみ使用され、右側では使用されません。使用する:

 gcc -Wall line.c  -lexpat -o blah

詳細については、質問ライブラリがリンクされていますが、参照が定義されていないことを確認してください。

于 2012-05-09T10:03:40.690 に答える