GCC编译、链接、运行时库查找顺序(最真实可信)

本文详细介绍了GCC在编译、链接及运行时查找库的顺序,包括直接依赖库和间接依赖库的搜索路径。内容涵盖-L选项、LIBRARY_PATH环境变量、gcc和ld的配置路径、-rpath-link等。还提到了库版本号的重要性,以及如何通过各种选项和工具来查看链接过程。
摘要由CSDN通过智能技术生成

参考了不少资料,其中最靠谱是这个:http://www.mingw.org/wiki/librarypathhowto

和http://www.kaizou.org/2015/01/linux-libraries/

经过线上实际验证,GCC编译、链接、运行时库查找顺序如下,这个顺序真实可信,网上很多说法有些地方都是有些问题的,

导致遇到问题时总是不确定到底是哪里出了问题,花了不少时间,绝知此事要躬行。

略微让人头疼的是,没有找到官方文档清晰说明什么情况下该如何查找依赖库目录,链接时查找直接依赖库和间接依赖库的方式

差别挺大。。。

一、概括GCC链接时搜索直接依赖库的先后顺序:

1、LDFLAGS选项 -L 参数指定的路径。
2、系统环境变量 LIBRARY_PATH(某些系统或编译器下可能无效)。
3、gcc安装时自身配置的搜索路径,gcc --print-search-dir | grep libraries 可查看,

一般会包含该版本gcc必需的库而不一定包含当前系统库路径,链接时会以-L参数形式传递给ld。

4、ld安装时自身配置的搜索路径,ld -verbose | grep SEARCH_DIR 可查看,

gcc通过调用collect2工具调用ld。

To summarize, when linking an executable against a static library, you need to specify explicitly all dependencies towards shared libraries introduced by the static library on the link command.


二、概括GCC链接时搜间接依赖库直接依赖库的依赖库的先后顺序:(即secondary dependencies

特别说明:搜索直接依赖库的链接查找顺序同样适用于编译生成动态的( shared)、可重定位(relocatable)目标的情形。

特别说明:本条目所列链接顺序仅适用于编译生成非动态的( non-shared)、非可重定位(non-relocatable)目标的情形,比如生成二进制可执行程序,ld手册中有明确说明,是否适合其它情形不确定。在此种情形下,查找一个依赖库自身的依赖库时,-L参数指定的搜索目录无效(至少某些情况下是如此),这不同于链接一个二进制时查找直接依赖目录的顺序。
(1) 参考linux man手册 ld说明:https://linux.die.net/man/1/ld  “ -rpath-link= dir”章节
(2)参考同样问题的分析:http://www.kaizou.org/2015/01/linux-libraries/
链接时对于依赖库中依赖的搜索顺序如下(摘自ld手册):

-rpath-link=dir

When using ELF or SunOS, one shared library may require another. This happens when an "ld -shared" link includes a shared library as one of the input files.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值