GCC链接库

本文详细解析了GCC静态链接库的顺序对编译过程的影响,强调了正确链接库顺序的重要性,尤其是在使用如googletest等依赖其他库的静态库时。文章通过实例展示了正确的链接顺序如何避免unreference错误,并解释了动态链接库与静态链接库在链接过程中的差异。

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

GCC 静态链接库的顺序很重要

链接器是这样工作的:从左向右搜索,如果标记未解决的符号(未定义的类,变量或函数),在后续的库中如果找到该符号的定义, 则把链接该库,引入该符号的定义,如果当前库中的符号定义暂时没有用到(即使后面需要用到)则丢弃。因此如果链接的顺序,不当,会导致符号定义找不到, 编译/链接时会报错“unreference”之类的错误。

静态链接库

静态链接库本身之间也会有相互依赖,因此静态链接库的顺序也需要注意。

常见的一个例子是使用google-test时,需要gtest, pthread连个库,其中gtest是静态库,pthread是动态库,但是gtest依赖于pthread。

所以gcc编译是gtest要放在pthread左边。

假设我们有一个使用google test的程序test.cpp, 则编译命令应该为:

gcc -std=c++11 test.cpp -lgtest -lpthread -o test
gcc -std=c++11 test.cpp -lpthread -lgtest -o test //wrong
gcc -std=c++11 -lgtest -lpthread test.cpp -o test //wrong

动态连接库

动态链接库之间不必考虑顺序, 动态链接库会解决其之间的链接关系。 但是动态库和静态库以及源文件之间的依赖关系要考虑

GCC 有多个链接库时,可以指定特定链接库

假设我们有两个链接库libfoo.so, 分别在/usr/lib和/home/user/lib , 而LD_LIBRARY_PATH=/home/usr/lib(/usr/lib是默认的库查找目录),这是我们编译时使用-lfoo, 则能找到两个同名的库,会冲突。这时可以指定使用哪个库,方法是加上路径,比如上文中google test的例子:

gcc -std=c++11 test.cpp /usr/lib/libgtest.a -/usr/lib/linux/libpthread.so -o test

 

https://stackoverflow.com/questions/45135

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值