链接器选项以列出使用的库
linker option to list libraries used
我在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)
....
相关文章:
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- CMake - 更改共享库链接选项
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- '-print_statistics'链接器选项在 Xcode 中产生错误
- C++ ld 链接器 --wrap 选项不适用于内部函数调用
- 提升程序选项:链接错误
- 如何从"开始组..结束组"链接器选项构建文件列表
- C++构建系统 - 远程编译和链接选项
- clang,linux是否有一个选项可以在链接时更改共享库名称
- 在源文件中定义链接选项C++
- 有-g和没有-DNDEBUG选项的链接时间很长
- 相同的C 代码,不同的链接选项会导致不同的行为
- AC_LANG_PROGRAM由于链接器选项的顺序失败了链接阶段
- 当我仅使用链接器选项 /LTCG时,为什么Visual Studio在Linker命令行中显示选项 /PGD
- 如何在CodeBlocks附加链接器选项中指定子系统
- 如何在scons中添加--whole archive链接器选项
- Netbeans 8.0.2 C++ 版本没有链接器选项
- CMake 是否add_compile_options在适当时影响链接器选项
- Eclipse CDT链接选项-静态libgcc-静态libstdc++不影响Windows上的行为