14

Linux プラットフォームで作業しており、GNU C++ コンパイラを使用しています。一部のシンボルが未定義であるというリンク エラーを解決しようとしています。コマンドラインで指定された名前のライブラリを見つけて、問題のシンボルが含まれていることを確認できます (「nm」ユーティリティを使用)。

コンパイル ステップで、コンパイルに #include されたヘッダー ファイルのリストを取得するために、'-c' の代わりにコマンド ライン フラグ '-H' を使用できることを知っています。リンカーに同様のオプションはありますか? リンカーが各「-lmylibrary」フラグを処理するために使用したファイルのリストを確認できれば、さらにトラブルシューティングを行うことができます。

4

1 に答える 1

16

未定義のシンボル エラーが発生した場合は、いくつかのライブラリをリンクするのを忘れたことを意味します。リンク先のライブラリを知っていても、それらのライブラリには明らかにシンボルが欠落しているため、おそらく思ったほど役に立たないでしょう。ただし、次の-print-file-name=libraryオプションを使用できます。 gcc がライブラリをリンクするために使用するパスを見つけます。例:

$ gcc -print-file-name=libc.a
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libc.a

--traceまた、リンカーに渡すと、同様の出力が表示されます

gcc -Wl,--trace myprog.c -o myprog -L. -lmylib
-lmylib (./libmylib.a)
-lgcc_s (/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libgcc_s.so)
....

(上記で--traceは、これはリンカーへの引数であるため、-Wl .involved gccfor linking は、それ自身--traceへの引数として有用なものを発行しないことに注意してください)。gcc

ldd また、プログラムを正常にビルドした後、使用された動的にリンクされたライブラリを見つけるために使用することもできます。その出力は次のようになります。

ldd `which ls`
linux-vdso.so.1 =>  (0x00007fff7ffff000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2e8ea93000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f2e8e88b000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f2e8e682000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2e8e2ee000)
....
于 2013-02-06T17:49:15.723 に答える