在静态库中链接失败,但链接共享库成功

Linking in a static library failes, but linking a shared library succeeds

本文关键字:链接 共享 成功 失败 静态      更新时间:2023-10-16

我可以根据共享库构建我的应用程序,但当我将其链接到同一库的静态版本时,会遇到未解决的符号错误:

我可以这样构建我的应用程序:

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是否正确?

  1. 正如@user10605163所提到的,LD_LIBRARY_PATH在编译和链接时不会找到静态库的路径。它是一些Linux发行版中使用的一个环境变量,用于在运行时搜索共享库。请在这里找到更多文档。它对构建和测试环境很有用,但不是推荐的在生产系统中链接的方式

验证静态库定义(解析)符号的确切命令是什么?命令nm——仅定义路径/to/utils。a

  1. 是的,这是正确的。然而,根据提供的信息,这个错误不太可能是utils中不存在符号的错误(因为它使用共享库),而是链接的错误

参考GNU文档GCC链接选项摘录:

-l库:链接时搜索名为库的库。链接器在标准目录列表中搜索库。搜索的目录包括几个标准系统目录以及您用-L指定的任何目录。

此外,使用-l链接选项,您需要提供库名称(不带"lib"和扩展名)或完整文件名。-鲁蒂尔如果需要,您也可以仅在此处提供直接完整路径。