文件包含错误(C ++):对______的未定义引用

时间:2012-01-04 23:57:27

标签: c++ header include

每当我编译#includes一个用户定义的类的东西时,我会得到总是这样的编译错误:main.cpp: undefined reference to Complex::Complex(double, double)

我已将问题简化为一组三个非常裸的文件:main.cpp,例如Complex.h和Complex.cpp。我仍然得到未定义的引用错误。我正在开发Windows上的Code :: Blocks,但我在Ubuntu中使用g ++也得到了同样的东西。为什么会这样?我尝试在Code :: Blocks中的main.cpp之前构建Complex.cpp,并且我尝试了g++ main.cpp Complex.cpp,就像我尝试g++ main.cpp一样。每次都有相同的错误。

/*======== main.cpp ========*/
#include "Complex.h"

int main()
{
    Complex A(1.0, 1.0);
    return 0;
}

/*======== Complex.h ========*/
#ifndef _COMPLEX_H
#define _COMPLEX_H

class Complex
{
    public:
    double x, y;
    Complex(double real, double imag);
};

#endif

/*======== Complex.cpp ========*/
#include "Complex.h"

Complex::Complex(double real, double imag)
{
    x = real;
    y = imag;
}

ed:现在我得到了不同的错误,所以我必须做一些完全错误的事情。使用与上面相同的代码,我得到:

main.cpp: in function 'int main()':
main.cpp:5:5: error: 'Complex' was not declared in this scope
main.cpp:5:13: error: expected ';' before 'A'

这很奇怪。当我在.cpp文件中使用类时,一切都工作得很早,但这是“不好的做法”所以我将类定义移动到.h文件并将实现保存在.cpp文件中,现在没有任何作用。

2 个答案:

答案 0 :(得分:7)

这不是编译错误,而是链接错误。您需要确保将所有对象链接在一起。您可以通过以下几种方式实现这一目标:

g++ main.cpp Complex.cpp

应该可以正常工作(当我尝试使用你的例子时,它会在这里工作)。您也可以分步执行:

g++ -c main.cpp
g++ -c Complex.cpp
g++ main.o Complex.o

答案 1 :(得分:1)

虽然我们不知道这是否是实际代码(可能不适用于其他几个代码),让我们对代码本身进行一些评论......(这对链接器错误没有任何影响) )

  1. 以下划线后跟大写字母开头的名称,例如_COMPLEX_H保留用于实现C ++编译器和C ++标准库。 不要使用它们。
  2. 成员变量最好private。很少需要制作实际的数据成员public(有时制作非功能成员public是合理的,例如用户可以订阅回调的事件类,但这些通常表现得像函数一样在技​​术上是对象)。
  3. 初始化最好在成员初始化列表中完成。也就是说,构造函数看起来像这样:

    复杂::复杂(双实,双重图像):     X(真),     Y(IMAG) { }

  4. 最后,冒险尝试一下导致链接问题的实际代码出了什么问题:

    1. 构造函数定义为inline。显然,除非在使用构造函数的地方看到定义,否则这将不起作用。
    2. Complex的声明以某种方式使它成为一个未命名的命名空间,因此定义恰好定义了一个不同于main.cpp所见的类。