gcc 链接器库搜索顺序;路径加静态与共享

Posted

技术标签:

【中文标题】gcc 链接器库搜索顺序;路径加静态与共享【英文标题】:gcc linker library search order; paths plus static vs shared 【发布时间】:2015-02-19 13:44:11 【问题描述】:

通读gcc手册,我相信以下两种说法是正确的:

    在“默认”路径之前搜索命令行中指定的库搜索路径(我认为这意味着 LIBRARY_PATH 环境变量中的内容)

    共享库将优先于静态库进行链接(在没有其他标志的情况下)

但这两者中哪一个占主导地位?例如,如果我输入

gcc myprog.cpp -o myprog -Lmypath -lmylibrary

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

【问题讨论】:

确保-lmylibrary 出现在您的.o(或.c)文件之后。 啊,是的,对不起,是这样,我会举一个更正确的例子。 快速提示:您可以让 gcc 使用g++ -E -x c++ - -v < /dev/null 列出实际路径除此之外,我想我之前已经在这里看到过这个问题的回答,包括如何通过指定来覆盖默认行为库的全名(w/.a/.so 扩展名)。 【参考方案1】:

在您的示例中,静态库 libmylibrary.a 将链接到 偏好任何可能的libmylibrary.alibmylibrary.so 存在于链接器的默认搜索目录之一中。链接器 在任何默认位置之前搜索mypath,并尽快 它找到了一个libmylibrary.alibmylibrary.so,它不会再找了 满足-lmylibrary

如果mypath 包含两者 libmylibrary.alibmylibrary.so,则 后者是首选。

我不确定“gcc 手册”指的是什么来源,但是 “gcc 链接器”是 GNU 链接器,ld,你会发现 命令行选项的含义在其manual中得到了很好的解释

【讨论】:

对不起,是的,我在谈论 ld 的手册页,正如您所链接的那样(尽管您的手册页比我系统上的要详细一些)“-L”标志上的部分给出了我声明(1),“-l”部分给了我声明(2)。但是,即使在您链接到的页面中,我也不清楚我提出的歧义是否已涵盖。但无论如何你说的有道理,所以我会接受答案:)。除非出现一些争论:p。 实际上,“-l”上的部分可能在技术上确实涵盖了它,因为它说“ld 将搜索 a 目录 以查找名为 libnamespec.so 的库,然后再搜索名为libnamespec.a.",即它只会在单个目录中搜索时更喜欢共享库。但是,很高兴能更明确地说出来,所以谢谢:)。

以上是关于gcc 链接器库搜索顺序;路径加静态与共享的主要内容,如果未能解决你的问题,请参考以下文章

CMake和静态库顺序

gcc找不到静态库中的函数

如何静态链接到 libstdc++.喜欢升级的GCC的朋友快来看看

我可以让 gcc 链接器创建一个静态库吗?

gcc 将共享库与依赖库链接

除了静态库之外,我还可以使用“gcc -llibnamehere”绑定共享库吗?