GCC链接器库搜索顺序:路径和静态与动态的区别

7

阅读gcc手册,我相信以下两个陈述是正确的:

  1. 命令行上指定的库搜索路径会先于“默认”路径(我认为这意味着LIBRARY_PATH环境变量中的内容)被搜索

  2. 共享库会优先链接静态库(如果没有标志要求另外操作的话)

但是这两者哪一个更具支配性?例如,如果我输入以下命令:

gcc myprog.cpp -o myprog -Lmypath -lmylibrary

在我的路径中有静态库"libmylibrary.a",在LIBRARY_PATH指定的某个地方有共享库"libmylibrary.so",这些库中哪一个将被使用?我的猜测是静态库将被使用(即(1)占主导地位),但我看到一些有趣的编译错误,让我对这个猜测产生了质疑,所以我想确保一下...


请确保在您的.o(或.c)文件之后出现-lmylibrary - nwellnhof
啊,是的,抱歉,我会提供一个更正确的例子。 - Ben Farmer
快速提示:您可以使用 g++ -E -x c++ - -v < /dev/null 命令让 gcc 列出实际路径。除此之外,我认为我之前在这里看到过这个问题的答案,包括如何通过指定库的完整名称(带有 .a.so 扩展名)来覆盖默认行为。 - swalog
1个回答

5
在您的示例中,静态库libmylibrary.a将优先链接于可能存在于连接器默认搜索目录之一中的任何libmylibrary.alibmylibrary.so。连接器在搜索默认位置之前搜索mypath,并且一旦找到libmylibrary.alibmylibrary.so,就不再继续寻找以满足-lmylibrary
如果mypath同时包含libmylibrary.alibmylibrary.so,则会优先选择后者。
我不确定您所指的“gcc手册”是什么来源,但“gcc链接器”是GNU链接器ld,您可以在其手册中找到命令行选项的含义。请注意保留HTML标记。

抱歉,是的,我在谈论ld的man页面,就像你链接的那个(尽管你的比我的系统上的多一些细节)。关于“-L”标志的部分给了我陈述(1),而关于“-l”标志的部分给了我陈述(2)。但即使在你链接的页面上,我也不清楚我提出的歧义是否得到了解决。但无论如何,你说的话很有道理,所以我会接受这个答案 :)。除非有什么争议出现 :p。 - Ben Farmer
实际上,也许"-l"部分在技术上已经涵盖了它,因为它说“ld将在搜索名为libnamespec.so的库之前搜索名为libnamespec.a的库所在的目录中查找一个目录”,即在单个目录中搜索时只会优先选择共享库。但仍然很好地明确说明一下,所以谢谢 :)。 - Ben Farmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接