文档介绍:undefined reference to error 解决方法
Linux 下编译程序时,经常会遇到“undefined reference error” 报错,
这里总结一些可能的原因和解决方案,给需undefined reference to error 解决方法
Linux 下编译程序时,经常会遇到“undefined reference error” 报错,
这里总结一些可能的原因和解决方案,给需要的朋友:
说道 undefined reference error,先提一下 Linux gcc 链接规则:
链接的时候查找顺序是:
-L 指定的路径, 从左到右依次查找
由 环境变量 LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找
/etc/ 指定的路径顺序
/lib 和 /usr/lib (64 位下是/lib64 和/usr/lib64)
动态库调用的查找顺序:
ld 的-rpath 参数指定的路径, 这是写死在代码中的
ld 脚本指定的路径
LD_LIBRARY_PATH 指定的路径
/etc/ 指定的路径
/lib 和/usr/lib(64 位下是/lib64 和/usr/lib64)
一般情况链接的时候我们采用-L 的方式指定查找路径, 调用动态链接库的时候采用
LD_LIBRARY_PATH 的方式指定链接路径.
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找. 比如-L./A -L./B -lx
在 A 中有 B 中有 和 , 这个时候会使用在./A 的 而不会遵循动态库
优先的原则,因为./A 是先找到的,并且没有同名动态库存在
对于动态链接库,实际的符号定位是在运行期进行的. 的时候,如果没有把它需
要的库和他一起进行联编,比如 需要使用 uldict, 但是忘记在编译 的时候加
上-luldict 的话,在编译 的时候不会报错,因为这个时候 被认为是一个库,它
里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制
程序的时候指定.
如果是采用 g++ -Lpath -lx 的方式进行编译,链接器会发现所需要的 uldict 的符号表找不
到从而报错,但是如果是程序采用 dlopen 的方式载入,由于是运行期,这个程序在这个地
方就直