原文链接: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”)也没解决,更改方法如下:
但是,这样依然没解决问题,并且第四种如果出问题,也应该不会报我自己定义的函数未找到,后来仔细查找,终于找到了问题所在。主要原因是函数声明与定义不一致导致的:
头文件里声明:
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++ 是可以函数重载的,所以找不到对应的函数,导致报错。