在静态库中链接失败,但链接共享库成功
Linking in a static library failes, but linking a shared library succeeds
我可以根据共享库构建我的应用程序,但当我将其链接到同一库的静态版本时,会遇到未解决的符号错误:
我可以这样构建我的应用程序:
g++ -lutils application.cpp -o application.exe
上面的命令链接到utils库的共享版本中。
我正在尝试链接静态版本的库,如下所示:
g++ -l:utils.a application.cpp -o application.exe
两次我都在使用
export LD_LIBRARY_PATH=path/to/utils:$LD_LIBRARY_PATH
通知g++utils.a的位置。
ld报告的未解析符号存在于nm:的输出中
nm --defined-only path/to/utils.a
并标有"T"(表示它来自代码部分)。
我正试图找出问题的原因。
使用LD_LIBRARY_PATH指定在哪里搜索utils.a是否正确?
验证静态库定义(解析)符号的确切命令是什么?命令是吗
nm --defined-only path/to/utils.a
足够了,或者我应该使用任何其他选项,如
nm --defined-only --demangle path/to/utils.a
例如。?
对于编译器来说,只有选项-static就足够了。如果只有一个库必须是静态的,那么-static和lib名称是短名称,而不是文件名。
使用LD_LIBRARY_PATH指定在哪里搜索utils.a是否正确?
- 正如@user10605163所提到的,LD_LIBRARY_PATH在编译和链接时不会找到静态库的路径。它是一些Linux发行版中使用的一个环境变量,用于在运行时搜索共享库。请在这里找到更多文档。它对构建和测试环境很有用,但不是推荐的在生产系统中链接的方式
验证静态库定义(解析)符号的确切命令是什么?命令nm——仅定义路径/to/utils。a
- 是的,这是正确的。然而,根据提供的信息,这个错误不太可能是utils中不存在符号的错误(因为它使用共享库),而是链接的错误
参考GNU文档GCC链接选项摘录:
-l库:链接时搜索名为库的库。链接器在标准目录列表中搜索库。搜索的目录包括几个标准系统目录以及您用-L指定的任何目录。
此外,使用-l链接选项,您需要提供库名称(不带"lib"和扩展名)或完整文件名。-鲁蒂尔如果需要,您也可以仅在此处提供直接完整路径。
相关文章:
- 链接共享库依赖项未在 ldd 中列出
- Gradle cpp 插件不链接共享库
- 从大型 github 项目链接共享库
- 如何在工具ROS中链接共享库
- Linux C++.链接共享对象和主对象
- 共享对象与提升program_options静态链接;应用程序链接共享
- G++ 5.5 不链接共享库
- 根据用户配置在运行时链接共享对象
- 在静态库中链接失败,但链接共享库成功
- G 无法链接共享对象的静态版本
- 仅当标头在 CMake 中更改时,才重新链接共享库
- 动态链接共享库中的全局变量和静态变量会发生什么情况
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 在VirtualBox的共享文件夹中构建符号链接共享库
- 编译对象后链接共享库时出错
- 如何通过GNU Autotools链接共享库
- 如何以正确的方式编译和链接C/ c++共享对象库
- 无法链接共享对象
- 在 R 包中生成和链接共享库 - 代码编译、链接,但不会加载
- 如何在cmake中链接共享对象