当我从使用GNU ld版本2.20到2.21时,我开始看到以下行为的变化。不确定2.20中的行为是否已经在2.21中修复,或者是否正在进行其他操作。
libfoo.so : provides symbols foo()
libfoobar.so : provides symbol bar() and specifies libfoo.so in its DT_NEEDED slot
main.cpp : uses symbols foo() as well as bar()
以前,我可以通过以下方式构建main.cpp:
g++ main.cpp -lfoobar
foobar.so对foo.so的内部依赖性将确保找到foo()以及bar()
现在,上面的内容不起作用,我也必须明确地链接foo:
g++ main.cpp -lfoobar -lfoo
所以我的问题是:什么是正确的行为 - 如果.so具有依赖关系,那么在搜索可执行文件中直接使用的符号时是否考虑它们,或者这些依赖关系仅在.so的私有命名空间中可用?< / p>
感谢。
答案 0 :(得分:0)
所以我的问题是:什么是正确的行为
新行为是正确的。
如果.so具有依赖关系,那么在搜索可执行文件中直接使用的符号时会考虑它们
没有。任何依赖关系libfoobar.so
都有私有实现细节,明天可能会改变。你应该不指望它。如果您使用libfoo.so
中的符号,则 应在命令行上指定-lfoo
。