"ld"如何查找共享对象的次要依赖项



我有一种情况,我们链接到某个共享库libfoo.so,这反过来又取决于libbar.so。如果我们直接链接一个依赖于libfoo.so的可执行文件,我们会通过提供以下标志来编译它:

-L<location of libbar.so> -lfoo

然而,这会在系统路径中拾取一个libbar.so,而不是在命令行上指定的位置,该位置具有不正确的符号集,从而导致未定义的引用。如果我们将命令更改为:

-L<location of libbar.so> -lfoo -lbar

右侧的libbar.sold找到。这是意料之中的事吗?我们如何告诉ld在某个位置找到次要依赖项而不显式链接到它?

如果未指定-lbar,则会隐式添加间接依赖的libbar。在这种情况下,该库的编译时链接搜索机制是不同的(运行时链接器ld.so在运行时搜索库的方式类似(。查看ld手册中的-rpath-link选项。在那里,您可以看到在-L目录中搜索这种情况仅在SunOs系统上完成。为间接依赖项指定编译时链接搜索路径的最佳方法是使用-rpath-link选项,因为这具有最高的搜索优先级。

相关内容

最新更新