gcc編譯連接std::__cxx11::string和std::string的問題

今天公司的小夥伴遇到一個問題,這裏作一個記錄。
問題是這樣的,他編譯了公司的基礎庫,而後在程序中連接的時候遇到點問題,報錯找不到定義。函數

用到的函數聲明大概是這樣的: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

相關文章
相關標籤/搜索