undefined reference to XXX 问题原因

原文地址:http://blog.csdn.net/cserchen/article/details/5503556

Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,

这里总结一些可能的原因和解决方案,给需要的朋友:

 

说道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和libx.so, 这个时候会使用在./A的libx.a 而不会遵循动态库优先的原则,因为./A是先找到的,并且没有同名动态库存在

 

 

对于动态链接库,实际的符号定位是在运行期进行的.在编译.so的时候,如果没有把它需要的库和他一起进行联编,比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定.

如果是采用 g++ -Lpath -lx 的方式进行编译,链接器会发现所需要的uldict的符号表找不到从而报错,但是如果是程序采用dlopen的方式载入,由于是运行期,这个程序在这个地方就直接运行报错了.另外还有一种情况就是一个对外的接口在动态库中已经声明定义了,但是忘记实现了,这个时候也会产生类似的错误.

如果在运行期报出这样的错误,就要注意是否是由于某些库没有链接进来或者某些接口没有实现的原因产生

 

 

有了上述基础,不难看出,undefined reference error错误的原因是:

0. 其实错误的名字很清楚了,就是没有找到你调用的方法的定义代码。从这里入手,应该就由线索了。如果还是不能解决,请参考下面几条。

1. 没有指定对应的库(.o/.a/.so) 使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,
2. 连接库参数的顺序不对 在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态
3. gcc/ld 版本不匹配 gcc/ld的版本的兼容性问题,由于gcc2 到 gcc3大版本的兼容性存在问题(其实gcc3.2到3.4也一定程度上存在这样的问题) 当在高版本机器上使用低版本的机器就会导致这样的错误, 这个问题比较常见在32位的环境上, 另外就在32位环境不小心使用了64位的库或者反过来64位环境使用了32位的库.
4. C/C++相互依赖和链接 gcc和g++编译结果的混用需要保证能够extern "C" 两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上 -lstdc++,具体见前文对于混合编译的说明
5. 运行期报错 这个问题基本上是由于程序使用了dlopen方式载入.so, 但.so没有把所有需要的库都链接上,具体参加上文中对于静态库和动态库混合使用的说明

时间: 2024-09-29 13:23:48

undefined reference to XXX 问题原因的相关文章

整理linux编译link出undefined reference’dlclose’错误解决办法

对于linux我持中立态度,而且我认为linux这么多年发展比较慢的原因是因为桌面化做的不好或者不够好,所以我比较偏爱ubuntu. 由于以前项目是makefile的,我个人不是很喜欢makefile,因为他看起来比较费劲,而且编译完成后出现问题调试是个大难题,不是每个人都精通gdb,而且vi上手比较难.所以将工程转为codeblocks的cbp,本来想使用cmake的,但是觉得要写的比较多,于是作罢,毕竟代码不是跨平台的,windows下没法用. 编译完link的时候,报了一句undefine

Linux下C编程:undefined reference to ‘pthread_create'问题解决

undefined reference to 'pthread_create' undefined reference to 'pthread_join' 问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库. 问题解决: 在编译中要加 -lpthread参数 gcc thread.c -o thread

undefined reference to 'pthread_create'的解决方法_Linux

照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误: undefined reference to 'pthread_create'undefined reference to 'pthread_join' 问题原因:    pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库. 问题解决:    在

解决Linux下编程时的undefined reference to问题

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助. 1.链接时缺失了相关目标文件(.o) 测试代码如下: 然后编译. gcc -c test.c gcc –c main.c 得到两个 .o 文件,一个是 mai

gcc-g++ undefined reference to 'std::cin'

问题描述 g++ undefined reference to 'std::cin' 用了g++,用了-lstdc++,直接写std::cin 都没有用 解决方案 试下初始化a,int a=0:不确定是否可行 解决方案二: 楼主不会是编译器或者stdc++库出了问题吧,建议楼主检查下 解决方案三: 此版本的Linux 系统为添加c++库,建议先下载库 解决方案四: 回复John_ToDebug: 我百度了,只找到了libstdc++.so,需要手动拷贝到lib,但是我在拷贝的时候说No such

"undefined reference to" 问题解决方法

  最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func'      关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助. 1.  链接时缺失了相关目标文件(.o)     测试代码如下:       然后编译. gcc -c test.c   gcc –c main

执行安装watchman报错undefined reference to __sync_add_and_fetch_4

/app/watchman-2.9.5/./watchman.h:104: undefined reference to `__sync_add_and_fetch_4' /app/watchman-2.9.5/./watchman.h:104: undefined reference to `__sync_add_and_fetch_4' watchman-root.o: In function `w_root_init': /app/watchman-2.9.5/root.c:191: un

apache 编译报错:undefined reference to `apr_array_clear'

apache 编译报错: modules/http/.libs/libmod_http.a(byterange_filter.o): In function `ap_set_byterange': byterange_filter.c:(.text+0x1201): undefined reference to `apr_array_clear' collect2: ld returned 1 exit status make[1]: *** [httpd] Error 1 make[1]: L

undefined reference to `SetPduPowerConsumptionCnt''错误的解决方法

编译时出现undefined reference to `SetPduPowerConsumptionCnt'错误要如何解决呢?有没有什么好的解决方法?下面小编就为大家解答吧,如果你也遇到了这种情况,可以过来参考下   问题:程序模型用C++语言编写,在程序模型和调用函数之间添加了一个接口文件modelc.cpp,用来让用c语言程序调用程序模型中的函数: 新添加了两个函数setPduPowerConsumptionCnt()和setPduPowerConsumptionTot(),用来清除PDU