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

时间:2018-12-28 12:56:17

标签: c++ linux g++ ld

我可以针对共享库构建应用程序,但是在将其与同一库的静态版本链接时遇到无法解决的符号错误:

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

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

例如?

2 个答案:

答案 0 :(得分:0)

对于编译器来说,仅-static选项就足够了。如果只有一个库必须是静态的,则-static-和lib name是短名称而不是文件名。

答案 1 :(得分:0)

  

使用LD_LIBRARY_PATH指定在哪里搜索utils.a是否正确?

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

验证静态库定义(解析)符号的确切命令是什么?是命令nm---defined-only path / to / utils.a

  1. 是的,这是正确的。但是,基于提供的信息,该错误不太可能是utils中不存在符号的错误(因为它与共享库一起使用),但具有链接。

引用GNU documentation GCC link options 摘录:

  

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

此外,使用-l链接选项,您需要提供库名(不带“ lib”和扩展名)或完整文件名。 -lutils或-llibutils.a 如果需要,您还可以仅在此处提供直接的完整路径。