在ubuntu下编译程序时,经常会遇到“undefined reference to xxx xx” 报错,这是一个程序猿经常犯的错误,也是比较容易解决的错误
/lib 和/usr/lib (64位下是/lib64和/usr/lib64)
动态库调用的查找顺序:
ld的-rpath参数指定的路径, 这是写死在代码中的
ld脚本指定的路径
LD_LIBRARY_PATH 指定的路径
/etc/ld.so.conf 指定的路径 /lib和/usr/lib(64位下是/lib64和/usr/lib64)
一般情况链接的时候我们采用-L的方式指定查找路径, 调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径.
这里总结一些可能的原因和解决方案,给需要的朋友:
首先,出现这个错误,很大可能是你根本没有包含这个函数申明的头文件,这个是新手容易犯的失误,你需要保证这个“undefined reference to xxx xx”的申明一定要在编译规则下找得到,这是最基本的,也是非常关键的,如果这个声明没找到的话,那编译系统不给你报个错误也算的是天理难容!
如果是编译一些库和中间件报错,undefined reference error,那就得先提一下Linux gcc链接规则:链接的时候查找顺序是:
-L 指定的路径, 从左到右依次查找由 环境变量LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找
/etc/ld.so.conf 指定的路径顺序/lib 和/usr/lib (64位下是/lib64和/usr/lib64)
动态库调用的查找顺序:
ld的-rpath参数指定的路径, 这是写死在代码中的
ld脚本指定的路径
LD_LIBRARY_PATH 指定的路径
/etc/ld.so.conf 指定的路径 /lib和/usr/lib(64位下是/lib64和/usr/lib64)
一般情况链接的时候我们采用-L的方式指定查找路径, 调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径.
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找. 比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和li