undefined reference to error解决方法

本文解析了Linux环境下编译链接程序时常见的“undefined reference”错误,并提供了多种解决方案,包括如何正确配置Makefile文件及使用特定编译器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://blog.youkuaiyun.com/xiaobai1593/article/details/6678506


Linux下编译,链接程序时,经常会遇到“undefined reference error” 报错,这种错误一般是在找不到相应的库文件的时候产生的。


下面是几个常见的问题(原理还不清楚,解释的也不专业,希望能解决一般问题)


1. undefined reference to `operator delete(void*)/‘new(void *)’


在用gcc进行编译时,有时候会出现这样的问题。


改用g++编译可以解决这种链接错误。


2.   undefined reference to `pthread_create`


这种情况是由于pthread.h所在的库并不是默认的链接库,需要用" -l "来告诉编译器,去寻找对应的库


gcc -lpthread -o  .o  .cpp


专业点的解释:使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误, 


3. main.cpp:(.text+0x281): undefined reference to `CServer::getInstance()'


自己编写的程序包含多个类时,在最后编译成可执行文件的时候,要把所用到的类的 ".o"文件包含,如果类之间有相互关系,则类之间的顺序也要注意。否则也会提示之类的错误。


例如:main函数包括class A, B, C,其中,B类变量是A类的成员变量之一


makefile文件写法(按照最保守的写法来,基本可以保证不是makefile文件的错,如果出错,在代码里找原因):


main: main.o A.o B.o C.o
g++ -o main main.o A.o B.o C.o
main.o: main.cpp
g++ -c -o main.o main.cpp
A.o:A.cpp
g++ -c -o A.o A.cpp
B.o:B.cpp
g++ -c -o B.o B.cpp
C.o:C.cpp
g++ -c -o C.o C.cpp
注意:B写在A后,以便A要调用B链接好的文件时,可以找的到。 


自己是新手,可能写的不简洁,但感觉这种写法比较保险。我自己做的时候成功了,不知道是否具有普遍适用性。


解释:


1. 在执行make的时候,第一句进行链接是先不执行的;


2. .o文件逐个编译,全部编译成功之后再用第一句链接成可执行文件。


下面是收集的点资料,以作补充。


博文1:http://forum.byr.edu.cn/pc/pccon.php?id=2620&nid=79318,应该比我的解释专业  


Undefined reference to 错误:这类错误是在连接过程中出现的,可能有两种原因∶


一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;


二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题.


“undefined reference to ”一般是在找不到相应的库文件的时候产生的,也跟具体的makefile文件有关系。


另外,文中还提到了虚函数的问题。在定义有虚成员函数的类时,一定注意:


1. 虚构函数的函数体:" virtual func() {  } "。这种错误不会提示编译错误,而是提示各种莫名其妙的链接错误,也挺汗的。


2. 当含有虚函数的类未将析构函数声明为virtual时也会出现这种链接错误。


博文二:http://www.linuxdiyf.com/viewarticle.php?id=182131


undefined reference error错误的原因可能来自以下几方面:


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没有把所有需要的库都链接上,具体参加上文中对于静态库和动态库混合使用的说明





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值