【问题标题】:C++ strange compile linker errorC++ 奇怪的编译链接器错误
【发布时间】:2009-07-23 13:19:55
【问题描述】:

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

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

非常感谢。

【问题讨论】:

  • 你能告诉我一些关于模板实例化的想法吗?
  • 你能把代码贴在你定义了 ~r_Marray 和 print_status 的地方吗?它们在 r_Marray 头文件中对吗?
  • 我检查了头文件,是的,它定义了这些方法,但是是虚拟的。该类派生自另一个类,并在基类中定义了 print_status 方法。在查看来源时,我遇到了 file.icc,它应该包含什么?而且,如果我在另一个目录 A 中有类并且我在目录 B 源文件中使用该类,前向声明如何工作?
  • 因为这个头文件中包含了很多其他的头文件,而且基类中定义了很多方法,所以我必须检查每个头文件才能知道哪里出了问题。这就是为什么,我无法发布源代码。
  • 前向声明不关心类的实际声明位置。话虽如此,由于您使用的是模板,因此如果您确实需要在头文件中使用该类,则可能很难转发声明。

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


【解决方案1】:

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

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

【讨论】:

  • 类似这样的链接错误的另一个常见原因是链接顺序不正确。例如,如果在 libMarray.a 中定义了 print_status 和析构函数,则 'g++ -lMarray test_oldquery.o' 会产生这样的错误。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    例如你有

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2016-07-09
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多