使用g++编译C/C++程序,链接时出现undefined reference to错误

时间:2022-03-05 09:43:28


原文链接:http://armsword.com/2013/11/10/undefined-reference-to.html


题目说是g++编译C/C++程序,其实是我这个程序是C、C++混着用的,这是错误的根源,弄了几个小时才发现问题根源,记录下吧:

通常链接时出现 undefined reference to 错误,一般是以下原因造成的:

1.链接时缺失相关目标文件(.o)

此时,注意缺少的目标文件或者相对应.c/cpp文件是否是跟在gcc语句后面

2.链接时缺少相关的库文件(静态库或动态库)

这个一般是动态库出问题,可以用ldconfig查看下,并且gcc链接语句里要有相应的.a或.so文件。

3.库文件链接顺序出错

这个其实看函数调用顺序吧,调用函数的顺序与库文件相同。

4.在C++中链接C语言相关的库

在C++中直接调用C语言库的函数,会导致出现undefined reference to错误,这是因为C++要对函数名重新命名(与C不一样),导致找不到C语言函数,所以需要在包含的头文件里包含extern “C” 。

本来我以为第四种是我今天问题出现的主要原因,我在main函数里调用其他函数,出现了 undefined reference to 错误,详情如下:

undefined reference to `looptopo(char*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, char const*)'


因为我调用了mysql以及net-snmp,这些是C函数库,链接时候可能会找不到对应的函数,但是,我更改后(添加了extern “C”)也没解决,更改方法如下:

使用g++编译C/C++程序,链接时出现undefined reference to错误

但是,这样依然没解决问题,并且第四种如果出问题,也应该不会报我自己定义的函数未找到,后来仔细查找,终于找到了问题所在。主要原因是函数声明与定义不一致导致的:

头文件里声明:

int looptopo(char *topoip,vector<string> &vector_type,const char *mib_type);

函数定义:
int looptopo(char *topoip,vector<string> &vector_type,char *mib_type)

{//省略}

你会发现头文件里函数声明,第三个参数与定义不一样,一个为const,一个为no-const,将函数定义改为如下,问题解决:
int looptopo(char *topoip,vector<string> &vector_type,const char *mib_type)


我想了想,这种情况产生的原因,因为第三个参数的实参是const类型,而声明也是const类型,所以函数编译时候是不会报错的,但是链接时候,因为C++ 是可以函数重载的,所以找不到对应的函数,导致报错。