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


今天公司的小伙伴遇到一個問題,這里做一個記錄。
問題是這樣的,他編譯了公司的基礎庫,然后在程序中鏈接的時候遇到點問題,報錯找不到定義。

用到的函數聲明大概是這樣的:

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宏定義即可。

或者程序都使用相同版本編譯器編譯也行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM