【问题标题】:Why do I get "DSO missing" error even when the linker can locate the library?为什么即使链接器可以找到库,我也会收到“DSO 缺失”错误?
【发布时间】:2016-11-16 01:34:37
【问题描述】:

我正在针对我编写的共享库编译程序。该库又依赖于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,但我问的是不同的:我知道解决方案是在命令行中提及库,我想知道为什么我必须这样做即使链接器已经知道库在哪里。对于共享库是如何工作的,显然有些地方我不明白,在我看来,当我使用其他共享库时,这些库可以自动调用他们需要的其他共享库。但是我搭建的共享库没有这个能力。

【问题讨论】:

标签: c++ dynamic-linking


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2021-01-20
    • 2021-12-30
    相关资源
    最近更新 更多