gcc编译链接的一些总结

GCC在链接过程中从左到右搜索库文件,影响函数加载顺序。如果库A依赖库B,则需确保B在A之前。举例说明,foo.o使用fa函数,bar.o使用fb函数,若-lz在bar.o之后,链接时会因找不到fb报错。因此,应将底层库放最后,应用层库放最前,以避免缺失依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译链接的顺序

-l library
           Search the library named library when linking.  (The second alter-
           native with the library as a separate argument is only for POSIX
           compliance and is not recommended.)
 
           It makes a difference where in the command you write this option;
           the linker searches and processes libraries and object files in the
           order they are specified.  Thus, foo.o -lz bar.o searches library z
           after file foo.o but before bar.o.  If bar.o refers to functions in
           z, those functions may not be loaded.

就是说gcc链接的时候是从左向右搜索的,foo.o -lz bar.o那么gcc的链接器先搜索库foo,然后是z库,然后是bar库。而链接搜索库的时候主要就是看当前用到了哪些函数和符合,比如当搜索到libz.so的时候只是把之前用到的函数和符合找出来,比如libz.so里面有两个函数 fa 和 fb,其中foo.o用到了fa,bar.o用到了fb,那么当搜索到libz.so的时候会把fa找出来,而fb就不要了,这样当连接到bar.o的时候就会因为缺少fb而报错。

所以我们要把底层库(即最可能被被人用到的库)放在最后,把应用层的库放在最前面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值