Eclipse (C++) 的未定义引用错误
Undefined reference error with Eclipse (C++)
我一直在学习C++,并且一直在使用一些测试代码来调试一个更大的项目的各个部分。我正在尝试使用另一个文件中的对象,但尽管包含适当的头文件,但我仍然收到未定义的引用错误。我在 Linux 上使用 Eclipse 和 C++ CDT。代码如下所示:
答.cpp
class A {
private:
int i;
int j;
public:
A(int i1, int i2) {
i = i1;
j = i2;
}
int sum() {
return (i+j);
}
};
A.H
#ifndef A_H_
#define A_H_
class A {
public:
A(int i1, int i2);
int sum();
};
#endif
主.cpp
#include <iostream>
#include "a.h"
int main() {
A a(1,2); //undefined reference to 'A::A(int,int)'
std::cout << a.sum(); //undefined reference to 'A::sum(void)'
return 0;
}
这是我的语法问题,还是我需要在编译器中挖掘?
问题是main.cpp
只看到标头a.h
中类的定义,而不包含构造函数和成员函数的定义。
在A.cpp
中定义了这些函数,但默认情况下它们被定义为内联函数。所以再次主要.cpp没有看到他们的定义。
考虑到根据C++标准(3.2 一个定义规则)
6 类类型可以有多个定义(第9条), 枚举类型 (7.2)、带外部链接的内联函数 (7.1.2), 类模板(条款 14)、非静态函数模板 (14.5.6)、 类模板的静态数据成员 (14.5.1.3),成员函数 类模板 (14.5.1.1),或模板专用化,其中一些 程序中未指定模板参数(14.7、14.5.5) 前提是每个定义出现在不同的翻译单元中, 前提是定义满足以下要求。鉴于 在多个翻译单元中定义了名为 D 的实体,然后
(6.1) — D 的每个定义应由相同的序列组成 代币;和
所以在 A 中.cpp你应该写
#include "a.h"
A::A(int i1, int i2) {
i = i1;
j = i2;
}
int A::sum() {
return (i+j);
}
此外,类定义应以分号结尾。
这不是您在C++中拆分类的公共接口和私有实现的方式。
为了使主代码编译
A a(1,2);
编译器需要已经知道A
的大小 - 这是因为存储是在本地分配的,即使调用初始化它的构造函数是在其他地方定义的。
您可以通过使用指针(最好是智能指针)或 pimpl 习语来避免这种耦合,但这是默认设置。
这意味着标头中类的定义必须是
class A {
int i;
int j;
public:
A(int i1, int i2);
int sum();
};
(请注意类定义末尾的'
,这很重要 - 您还需要确保使用#endif
终止了包含保护)。
然后,实现 cpp 文件应如下所示
#include "a.h"
A::A(int i1, int i2) : i(i1), j(i2)
{
}
int A::sum()
{
return (i+j);
}
您只能定义一次A
,因此在标头和实现文件中不能有不同的定义。
现在这些问题已修复:如果原始错误仍然存在,则残留问题可能与您的编译/链接设置有关。
每个人都在说关于定义的东西是真的。但还有其他一些问题:
- 您需要在类定义的右大括号后
;
分号 - 您需要在
#ifndef
之后有一个#endif
指令(通常位于头文件的末尾) - 即使使用
#include <iostream>
,cout
也不会导出到顶级命名空间。你必须把它称为std::cout
这是一个完整的工作示例。这是一个文件,但如果需要,您可以自己拆分它:
#ifndef A_H_
#define A_H_
class A {
private:
int i;
int j;
public:
A(int i1, int i2);
int sum();
};
#endif
A::A(int i1, int i2) {
i = i1;
j = i2;
}
int A::sum() {
return (i+j);
}
#include <iostream>
int main() {
A a(1,2);
std::cout << a.sum();
return 0;
}
自己在线试用
- 对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()' 错误的未定义引用