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