c++ - 列出使用的库的链接器选项

我正在使用 Linux 平台并使用 GNU C++ 编译器。我正在尝试解决显示某些符号未定义的链接错误。我可以使用命令行中提供的名称查找库,并查看它们是否包含有问题的符号(使用“nm”实用程序)。

我知道对于编译步骤,我可以使用命令行标志“-H”而不是“-c”来获取编译中#included 的头文件列表。链接器是否有类似的选项?我想如果我能看到链接器用来处理每个“-lmylibrary”标志的文件列表,我可以进一步排除故障。

最佳答案

如果您收到 undefined symbol 错误,则意味着您忘记链接某个库,知道您链接到的库可能没有您想象的那么有用,因为显然这些库中缺少符号,但是您可以使用-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链接器的参数,因此它进入 -Wlgcc为链接而调用的 不会发出任何对 --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)
....

https://stackoverflow.com/questions/14735387/

相关文章:

c# - TFS 构建失败。对源代码管理中的文件的未解决引用

node.js - 构建工具 : Coffeescript/Node project with mu

eclipse - 您知道 *latest* eclipse 组件的更新站点地址吗?

maven-2 - 使用 maven-assembly-plugin 构建一个 jar 并将其包含在

plugins - Jenkins 插件基于控制台输出失败构建

python - 使用 PyInstaller 2.1 和 MEIPASS 错误捆绑数据文件 --o

visual-studio-2008 - 仅构建启动项目的键盘快捷键?

build - 如何在 MultiJob 插件中传递内部版本号?

vim - 在vim中设置一个 "build directory"?

r - 在 RStudio 中构建包时如何解决 Rd 警告 "missing file link"?