使用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的信息很容易能找出來。