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++中。編譯器在看到模板的定義的時候。並不馬上產生代碼,僅僅有在看到用到模板時,比方調用了模板函數 或者 定義了類模板的

對象的時候。編譯器才產生特定類型的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM