链接器选项以列出使用的库

linker option to list libraries used

本文关键字:选项 链接      更新时间:2023-10-16

我在Linux平台上工作,使用GNU C++编译器。我正在努力解决一个链接错误,说一些符号是未定义的。我可以找到命令行上提供名称的库,并查看它们是否包含有问题的符号(使用"nm"实用程序)。

我知道,对于编译步骤,我可以使用命令行标志"-H"而不是"-c"来获得编译中#包含的头文件的列表。链接器是否有类似的选项?我想如果我能看到链接器用来处理每个"-lmylibrary"标志的文件列表,我就能进一步解决问题。

如果你得到一个未定义的符号错误,这意味着你忘记链接某个库,知道你链接到哪些库可能不会像你想象的那样有用,因为这些库中显然缺少符号,但是你可以使用-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。为链接而调用的gcc不会发出任何有用的--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)
....