报错信息
Undefined symbols for architecture x86_64:
"void PrintNum<int>(int)", referenced from:
_main in main-d2a7a9.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
错误描述
在如下图所示的文件中展现的调用关系,在一个.cc(main.cc)文件中调用另一个.cc(test.cc)文件中的模板函数,编译过程出错。
// test.cc
template<typename T>
void function(T a) { ... }
//test.h
template<typename T>
void function(T a);
//main.cc
int main() {
int a=0;
function(a);
}
原因分析
c++从代码到可执行文件,经历了编译和连接两大步骤。在第一个步骤中,编译是指将一个个cpp文件及其include的.h头文件编译成一个个***文件,一个cpp及其include的头文件表示一个编译单元。当编译器将一个工程中的所有的cpp文件以分离的方式编译完毕后,再由连接器进行连接构成一个可执行文件。
按照上面的描述,上述出错的原因就很明显了