undefined reference to error解决方法

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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页