C ++奇怪的编译链接器错误

时间:2009-07-23 13:19:55

标签: c++ g++ compiler-errors

我正在尝试编译大型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 tor_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。

请原谅,我不能在这里提交完整的源代码,因为它非常大并跨越多个目录。

非常感谢。

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()的实现但是忘了这样做 - 它将编译正常但不会与您看到的错误链接。或者您可以提供实现但不包含具有该实现的文件到链接器的输入中。