我正在尝试编译大型C ++项目,我收到了这个奇怪的错误。我知道这是链接错误但无法弄清楚究竟是什么。
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray]+0x8): undefined reference to r_Marray<unsigned char>::~r_Marray()'
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray<unsigned char>]+0xc): undefined reference to
r_Marray::~r_Marray()'
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray]+0x28): undefined reference to `r_Marray::print_status(std::basic_ostream >&) const'
这个错误是什么意思?并且,是否可以看到发生错误的行号?怎么样 ?我主要关注这意味着什么
".rodata._ZTV8r_MarrayIhE[vtable for r_Marray]+0x28"
实际上,我的错误是这样的,但是不知道为什么角括号内的所有东西都丢失了,所以用“”替换它们,这里是详细错误,它与模板实例化有关,
r_Marray<unsigned char>::~r_Marray()'
test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray<unsigned char>]+0xc): undefined reference to
我正在使用g ++ 4.3.3。
请原谅,我不能在这里提交完整的源代码,因为它非常大并跨越多个目录。
非常感谢。
答案 0 :(得分:6)
首先,链接器错误和编译器错误是不同的事情。由于链接器处理目标文件而不是源文件,因此编译器错误具有行号,但链接器错误不会。
其次,您似乎已经为 r_Marray 声明了析构函数,但尚未在构建中包含的任何位置实现它。 print_status 也是如此。
答案 1 :(得分:4)
您尚未定义 r_Marray :: ~r_Marray()和 r_Marray :: print_status ,或者包含这些方法的cpp文件不是您构建过程的一部分。< / p>
如果你确实有定义了这些方法的cpp文件,请发布你的Makefile。
根据您对问题的评论,我假设r_Marray是模板类?您是否在头文件中有r_Marray方法的定义?
答案 2 :(得分:2)
如果您已声明方法但未提供或未链接其实现,则通常会发生这种情况。
例如你有
class r_Marray {
public:
~r_Marray();
};
并且您打算在文件r_Marray.cpp中提供r_Marray :: ~r_Marray()的实现但是忘了这样做 - 它将编译正常但不会与您看到的错误链接。或者您可以提供实现但不包含具有该实现的文件到链接器的输入中。