g++链接报collect2 error ld returned 1 exit status错误

一个晚上都没有解决这个bug,问了个同学才知道。

模板编程时,如果分离编译会造成链接出错,报collect2 error ld returned 1 exit status错误。

解决方案:

1. 实现写到.h文件中,当然这样可能会造成可执行程序过大;

2. 在模板实现文件中实例化一份别的cpp需要用到的模板实例。

 

原因:

链接器去别的.o文件找实现,模板实现类没有实例化的代码,比如你需要A<int>,而模板实现类.o文件中找不到A<int>的函数入口,所以出错。

 

具现(instantiations):表示程序将真正的类型和表达式绑定到模板相关形式参数上的操作。也叫做实例化。

在C++中。编译器在看到模板的定义的时候。并不马上产生代码,仅仅有在看到用到模板时,比方调用了模板函数 或者 定义了类模板的

对象的时候。编译器才产生特定类型的代码。

 

Appendix:

普通的链接出错一般就是找不到实现,或者漏掉了需要链接的目标文件或动态、静态链接库,查找一下即可。

在C++中。编译器在看到模板的定义的时候。并不马上产生代码,仅仅有在看到用到模板时,比方调用了模板函数 或者 定义了类模板的

对象的时候。编译器才产生特定类型的代码。

posted @ 2022-03-31 10:41  Ray-ss  阅读(2158)  评论(0编辑  收藏  举报