C/C++编译和链接原理,undefined reference

文章讨论了C++编译过程中链接库的顺序对解决undefinedreference错误的影响,强调了依赖库应放在被依赖库之前。同时提到了--as-needed选项,该选项可能导致某些库虽声明但未实际链接,从而引起符号未定义的问题。正确放置库和使用-Wl,--as-needed选项是解决问题的关键。
摘要由CSDN通过智能技术生成

C/C++编译和链接原理 - 知乎 (zhihu.com)

C++ 链接库顺序导致的符号未定义问题 | 拾荒志 (murphypei.github.io)

linux下so动态库一些不为人知的秘密(上) (360doc.com)

undefined reference to_51CTO博客_undefined reference to `dlsym'

因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。

C++ 链接库顺序导致的符号未定义问题 | 拾荒志 (murphypei.github.io)

也就是说对于日常命令行编译命令,一般从左到右分别是可执行文件 ——> 高级库 ——> 底层库,避免循环依赖;越是底层的库,越是往后面写,可以参考下述命令通式:

g++ ... obj($?) -l(上层逻辑lib) -l(中间封装lib) -l(基础lib) -l(系统lib) -o $@

5. 在c++代码中链

"undefined reference to XXX"问题总结 - 知乎 (zhihu.com)

as-needed 选项

在高版本(本文用的是 5.4)gcc/g++ 中,默认开启了 ld 的 –as-needed 选项。这个选项也会导致一些符号未定义问题。分析这个编译命令:

g++ -shared PyGalaxy.o -lGalaxyParser -lxxx -lrt -o PyGalaxy.so

像这样链接一个 PyGalaxy.so 的时候,假设 PyGalaxy.so 里面用到了 libGalaxyParser.so 但是没有用到 libxxx.so。当开启 –as-needed 的时候,PyGalaxy.so 将不会链接 libxxx.so–as-needed 就是忽略链接时没有用到的动态库,只将用到的动态库 set NEEDED。

就是因为 –as-needed 的忽略功能,会导致一些库虽然被声明链接了,实际并没有,所以也会导致其他需要用的库(当然定义在其后)产生符号未定义问题。下面举例说明:

g++ -Wl,--as-needed -lGalaxyRT -lc -lm -ldl -lpthread -L/home/ocaml/lib/ -lrt -o mutex mutex.o

假设 mutex 依赖 libGalaxyRT.so 中的东西。想想,因为 gcc 对库的顺序要求和 –as-needed(因为 libGalaxyRT.so 在 mutex.o 的左边,所以 gcc 认为没有用到它,–as-needed 将其忽略),ld 忽略 libGalaxyRT.so,定位 mutex.o 的符号的时候当然会找不到符号的定义!所以 undefined reference to 这个 错误是正常地!

正确的链接方式是:

g++ -Wl,--as-needed mutex.o -lGalaxyRT -lc -lm -ldl -lpthread -L/home/ocaml/lib/ -lrt -o mutex

  • 本文作者: murphypei

strace ./demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值