我正在针对我编写的共享库编译一个程序。这个库又依赖于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
。我不明白的是
即使我的程序不直接调用 Boost(仅通过我的 glsim 库),为什么我必须这样做。
为什么链接器想要-lboost_program_options
当它实际上自己找到正确的库(和位置)时(请参阅错误消息的第二行)。
情况类似于所问的情况,例如here https://stackoverflow.com/questions/19901934,但我问的是不同的问题:我知道解决方案是在命令行中提及库,我想知道why我必须这样做即使链接器已经知道图书馆在哪里。显然我不明白共享库是如何工作的,在我看来,当我使用其他共享库时,这些库可以自动调用其他共享库they需要。然而我构建的共享库不具备这个能力。
现代发行版(例如Ubuntu Natty 及更高版本 https://lists.ubuntu.com/archives/ubuntu-devel/2010-November/031991.html) 使能够- 如所须 http://www.bnikolic.co.uk/blog/gnu-ld-as-needed.html默认情况下在其工具链中标记。副作用之一是链接器更严格地跟踪库的顺序(不确定为什么这样做,可能是为了匹配静态库的情况)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)