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.a
或libmylibrary.so
存在于链接器的默认搜索目录之一中。链接器
在任何默认位置之前搜索mypath
,并尽快
它找到了一个libmylibrary.a
或libmylibrary.so
,它不会再找了
满足-lmylibrary
。
如果mypath
包含两者 libmylibrary.a
和libmylibrary.so
,则
后者是首选。
我不确定“gcc 手册”指的是什么来源,但是
“gcc 链接器”是 GNU 链接器,ld
,你会发现
命令行选项的含义在其manual中得到了很好的解释
【讨论】:
对不起,是的,我在谈论 ld 的手册页,正如您所链接的那样(尽管您的手册页比我系统上的要详细一些)“-L”标志上的部分给出了我声明(1),“-l”部分给了我声明(2)。但是,即使在您链接到的页面中,我也不清楚我提出的歧义是否已涵盖。但无论如何你说的有道理,所以我会接受答案:)。除非出现一些争论:p。 实际上,“-l”上的部分可能在技术上确实涵盖了它,因为它说“ld 将搜索 a 目录 以查找名为 libnamespec.so 的库,然后再搜索名为libnamespec.a.",即它只会在单个目录中搜索时更喜欢共享库。但是,很高兴能更明确地说出来,所以谢谢:)。以上是关于gcc 链接器库搜索顺序;路径加静态与共享的主要内容,如果未能解决你的问题,请参考以下文章