今天公司的小伙伴遇到一個問題,這里做一個記錄。
問題是這樣的,他編譯了公司的基礎庫,然后在程序中鏈接的時候遇到點問題,報錯找不到定義。
用到的函數聲明大概是這樣的:
void function(const std::string& in,int* out);
編譯的時候顯示找不到定義,報錯大概是這樣的:
‘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
宏定義即可。
或者程序都使用相同版本編譯器編譯也行。