> 文章列表 > C/C++编译和链接原理,undefined reference

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

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

C/C++编译和链接原理 - 知乎 (zhihu.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