error: linker command failed with exit code 1 (use -v to see invocation)

使用C++編譯程序,有時會出現這個錯誤:


ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


具體原因有許多,目前遇到的有這些:


1. template的使用問題--模版類的聲明和模版類的實現分開:


C++的模版編譯標準有兩種方式:


1. 分離式 (允許模版類的聲明和實現分開)使用關鍵字export即可。但由於這是C++03的標準了,許多主流的編譯器都不再支持這種方式了(包括我的clang)。到了C++ 11,便完全放棄了。



2. 包含式(目前使用的模版編譯標準)要求模版類的聲明和實現放在一起。


       因爲現在較新的C++編譯器都只支持包含式了,所以把聲明和實現分開,就會報錯。但是,我測試過了,假設有兩個文件:模版類的聲明和實現,不加export關鍵字,編譯出模版類的.o文件是沒有問題的。只有在將demo文件main.o(含模版類實例化語句)和模版類的.o文件鏈接起來的時候,纔會出現鏈接錯誤(linker error)。


References:

[1]   http://www.zhihu.com/question/20630104

[2] 《C++ Primer Plus sixth edition》P569


2. 函數沒有實現或找不到


舉個例子:有兩個文件:main.cpp 和 LinkedList.cpp,當main.cpp中使用了LinkedList.cpp中的函數。這個函數還沒實現的。把這兩個文件編譯成.o文件的時候沒有問題。但是鏈接的時候會出問題。


然後還有一個找不到,其實就是一個函數找不到另外一個函數,換言之,即不在一個域(scope)裏面。

這是發生概率最高的,此種類型的錯誤通過log的信息很容易能找出來。



發佈了36 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章