今天公司的小夥伴遇到一個問題,這裏作一個記錄。
問題是這樣的,他編譯了公司的基礎庫,而後在程序中連接的時候遇到點問題,報錯找不到定義。函數
用到的函數聲明大概是這樣的:code
void function(const std::string& in,int* out);
編譯的時候顯示找不到定義,報錯大概是這樣的:blog
‘function(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&,int*)’未定義的引用
我直接寫了一個同樣的function
函數的代碼,而後使用strings
對比了下基礎庫中的和直接使用代碼編譯出來的函數簽名,發現二者不同。
而後看了一下他的基礎庫的編譯,原來他基礎庫編譯的時候使用的是gcc 5.3
,可是他使用的gcc
版本是7.4
,而7.4
已經默認使用C++11
了,而在C++11下,std::string
使用的是std::__cxx11
下的,二者ABI不同。編譯器
解決辦法
要解決這個問題,只須要在編譯的時候添加_GLIBCXX_USE_CXX11_ABI=0
宏定義便可。
string
或者程序都使用相同版本編譯器編譯也行。it