g++链接器错误:未定义的引用
g++ linker error: undefined reference
我正在编写一个模板化的Matrix
类,并在Matrix.h
中包含声明,在Matrix.cpp
中实现。我有一个测试文件testMatrix.cpp
。
文件的开头如下所示:
矩阵.h
#ifndef _MATRIX
#define _MATRIX
#include <string.h>
// Definition of Matrix class
#endif
矩阵.cpp
#include "Matrix.h"
#include <iostream>
using namespace std;
// ...Implementation
testMatrix.cpp
#include "Matrix.h"
#include <iostream>
using namespace std;
int main () {
cout << "Test constructors...n";
cout << "Unitialized matrix (4, 4):n";
Matrix<int> mi1 (4, 4);
mi1.print ();
cout << "4*4 matrix initialized to -1:n";
Matrix<int> mi2 (4, 4, -1);
mi2.print();
cout << "Constructing mi3 as a copy of mi2:n";
Matrix<int> mi3 (mi2);
mi3.print();
cout << "Assigning mi3 to mi1:n";
mi1 = mi3;
mi1.print();
return 0;
}
我用来编译的命令行:
g++ -Wall -lrt -g Matrix.cpp testMatrix.cpp -o testMatrix
编译器一直给我错误:
/tmp/ccofoNiO.o: In function `main':
/afs/ir/users/t/i/tianxind/practice/Essential_C++/testMatrix.cpp:9: undefined reference to `Matrix<int>::print() const'
collect2: ld returned 1 exit status
有人知道这里出了什么问题吗?非常感谢!
模板函数/类的实现必须在实例化时对编译器可见。这意味着您应该将整个模板放在头文件中,而不是放在.cpp
文件中。
首先,确保您已经定义了打印函数。然后您应该知道,当您声明一个模板化类时,无论何时使用该类,都需要提供实现。换句话说,将实现从.cpp文件移到.h文件中。
是的,实现必须在头文件中,否则编译器不知道需要专用函数(在解析模板之后)。
您也可以将实现放在.inl文件(或simmilar)中,并将其包含在.h文件的末尾。通常就是这样做的,将分离和实现保存在单独的文件中(以保持清晰)。
相关文章:
- 对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()' 错误的未定义引用