文件包含错误 (C++):未定义对 ______ 的引用
File inclusion errors (C++): undefined reference to ______
每当我编译 #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
虽然我们不知道这是否是实际代码(可能不适用于其他几个代码(,但让我们对代码本身进行一些评论......(这不会对链接器错误产生任何影响(
- 以下划线后跟大写字母开头的名称(例如 _COMPLEX_H(保留用于实现C++编译器和C++标准库。不要使用它们。
- 成员变量最好
private
。很少需要使实际的数据成员public
(有时将非函数成员public
是合理的,例如用户可以订阅回调的事件类,但这些通常表现得像函数,尽管它们在技术上是对象(。 -
初始化最好在成员初始值设定项列表中完成。也就是说,构造函数将如下所示:
复杂::复杂(双重真实,双重图像(: x(实数(, y(imag({}
最后,冒昧地猜测一下实际代码出了什么问题,导致链接问题:
- 构造函数定义为
inline
。显然,除非定义在使用构造函数的位置可见,否则这将不起作用。 Complex
的声明以某种方式使其成为一个未命名的命名空间,因此定义恰好定义了与main.cpp看到的类不同的类。
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用