未定義のシンボル エラーが発生した場合は、いくつかのライブラリをリンクするのを忘れたことを意味します。リンク先のライブラリを知っていても、それらのライブラリには明らかにシンボルが欠落しているため、おそらく思ったほど役に立たないでしょう。ただし、次の-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 gcc
for 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)
....