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

File inclusion errors (C++): undefined reference to ______

本文关键字:未定义 引用 错误 C++ 文件包      更新时间:2023-10-16

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

我已经将问题简化为一组三个极其裸露的文件:main.cpp,例如Complex.h和Complex.cpp。我仍然收到未定义的引用错误。我正在Windows上使用Code::Blocks进行开发,但是我在Ubuntu中使用g ++得到了同样的东西。为什么会这样?我已经尝试在 main.cpp 之前构建 Complex.cpp在 Code::Blocks 中,并且我已经尝试了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文件中,现在没有任何效果。

这不是编译错误,而是链接错误。 您需要确保将所有对象链接在一起。 您可以通过以下几种方式执行此操作:

g++ main.cpp Complex.cpp

应该工作正常(当我尝试使用您的示例时,这里确实如此(。 您也可以分步完成:

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

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

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

    复杂:

    :复杂(双重真实,双重图像(: x(实数(, y(imag({}

最后,冒昧地猜测一下实际代码出了什么问题,导致链接问题:

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