0

我正在尝试编译大型 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[r_Marray 的vtable]+0x28”

其实我的错误是这样的,但是不知道为什么尖括号里面的东西都不见了,所以用“”替换它们,这里是详细的错误,它也与模板实例化有关

test_oqlquery.o:(.rodata._ZTV8r_MarrayIhE[vtable for r_Marray"unsigned char"]+0x8): undefined reference to `r_Marray"unsigned char"::~r_Marray()'

我正在使用 g++ 4.3.3。

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

非常感谢。

4

3 回答 3

6

首先,链接器错误和编译器错误是不同的东西。由于链接器处理目标文件而不是源文件,因此编译器错误有一个行号,但链接器错误没有。

其次,您似乎已经为r_Marray声明了析构函数,但还没有在构建中包含的任何地方实现它。print_status也是如此。

于 2009-07-23T13:27:35.270 回答
4

要么你没有定义r_Marray::~r_Marray()r_Marray::print_status要么包含这些方法的 cpp 文件不是你的构建过程的一部分。

如果您确实定义了这些方法的 cpp 文件,请发布您的 Makefile。

根据您对问题的评论,我假设 r_Marray 是模板类?你的头文件中有 r_Marray 方法的定义吗?

于 2009-07-23T13:24:07.740 回答
2

如果您声明了一个方法但没有提供或没有链接它的实现,这通常会发生。

例如你有

class r_Marray {
public:
    ~r_Marray();
};

并且您打算在文件 r_Marray.cpp 中提供 r_Marray::~r_Marray() 的实现,但忘了这样做 - 它会编译得很好,但不会与您看到的错误链接。或者您可能已经提供了实现,但没有将具有该实现的文件包含到链接器的输入中。

于 2009-07-23T13:21:39.663 回答