c++ - 为什么即使链接器可以找到库,我也会收到 "DSO missing"错误?

标签 c++ dynamic-linking

我正在针对我编写的共享库编译程序。该库又依赖于 Boost::program_options(以及其他库)。当我编译我的程序时,我当然需要提及我的库,但是我得到一个 DSO 错误:

g++ ism_create_conf.cc -o ism_create_conf -lglsim_ol -lglsim -lhdf5 -lgsl

/usr/bin/ld.real: /tmp/cc9mBWmM.o: undefined reference to symbol_ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi'
//usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.55.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

我知道如果我添加 -lboost_program_options 错误就会消失。我不明白的是

  1. 为什么我必须这样做,即使我的程序不直接调用 Boost(仅通过我的 glsim 库)。

  2. 为什么链接器需要 -lboost_program_options 而实际上它自己找到了正确的库(和位置)(请参阅错误消息的第二行)。

    <

情况与询问的情况类似,例如 here ,但我问的是不同的问题:我知道解决方案是在命令行中提及库,我想知道为什么我必须这样做即使链接器已经知道 em> 图书馆在哪里。显然我不明白共享库是如何工作的,在我看来,当我使用其他共享库时,这些库可以自动调用它们需要的其他共享库。但是,我构建的共享库没有这个能力。

最佳答案

现代发行版(例如 Ubuntu Natty and later )启用 --as-needed默认情况下在他们的工具链中标记。副作用之一是链接器更严格地跟踪库的顺序(不确定为什么这样做,可能是为了匹配静态库的情况)。

关于c++ - 为什么即使链接器可以找到库,我也会收到 "DSO missing"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38352092/

相关文章:

c# - 在 C# 中使用导入的 C++ dll 中的事件处理程序

c - 程序和共享库之间何时进行动态链接?

c++ - 我们可以通过哪些不同的方式动态链接 DLL

security - 动态链接不太安全?

java - UnsatisfiedLinkError 在 Java 中使用 swig

c++ - 在 C++ 中有效地解析日志文件的文本

c++ - 使用 getline 从文本文件中读取

c++ - 调用不属于基类的派生类函数的最佳方法是什么?

c++ - 为什么非侵入式序列化要添加 5 字节零前缀?

linux - readelf 不显示共享库的版本号