我有一种情况,我们链接到某个共享库libfoo.so
,这反过来又取决于libbar.so
。如果我们直接链接一个依赖于libfoo.so
的可执行文件,我们会通过提供以下标志来编译它:
-L<location of libbar.so> -lfoo
然而,这会在系统路径中拾取一个libbar.so
,而不是在命令行上指定的位置,该位置具有不正确的符号集,从而导致未定义的引用。如果我们将命令更改为:
-L<location of libbar.so> -lfoo -lbar
右侧的libbar.so
由ld
找到。这是意料之中的事吗?我们如何告诉ld
在某个位置找到次要依赖项而不显式链接到它?
如果未指定-lbar
,则会隐式添加间接依赖的libbar。在这种情况下,该库的编译时链接搜索机制是不同的(运行时链接器ld.so
在运行时搜索库的方式类似(。查看ld
手册中的-rpath-link
选项。在那里,您可以看到在-L
目录中搜索这种情况仅在SunOs系统上完成。为间接依赖项指定编译时链接搜索路径的最佳方法是使用-rpath-link
选项,因为这具有最高的搜索优先级。