問題
報錯信息: undefined reference to `cv::imread(std::string const&, int)'
出現了如上錯誤我還以為是opencv的鏈接出現問題,便一直試圖解決導入opencv,嘗試了多種方式鏈接庫,但最終一直會出現該報錯
最終發現是C++ ABI的問題
解決方案
代碼中#define _GLIBCXX_USE_CXX11_ABI 0導致了該報錯,去掉就可以正常運行了
原因
#define _GLIBCXX_USE_CXX11_ABI 0是讓編譯鏈接時采用舊版本的ABI
在GCC 5.1 版本發布的libstdc++(GCC下C++標准庫)中,添加了std::basic_string新的實現。新的實現與舊的實現保持共存,但有着不同名字,新的實現叫做std::__cxx11::basic_string, 舊的叫做std::basic_string。
GCC的較新版本在編譯時會將std::string類型按c++11下std::__cxx11::basic_string<char> 來處理,這時如果你調用的第三方庫在編譯時未啟用c++11特性,那么其中的std::string實際上是std::basic_string<char>,這兩者不能相互轉換。#define _GLIBCXX_USE_CXX11_ABI 0就是讓自己代碼中的std::string按照舊實現編譯
但我的OpenCV在編譯時用的應該已經是std::basic_string的新實現,所以並不需要設置。如果設置了反而會出現標題所示的錯誤。
但如果第三方庫用的是舊實現,自己的編譯器是新版本,則需要加#define _GLIBCXX_USE_CXX11_ABI 0, 否則會出現undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits
進一步測試
在不同IDE下,該問題的表現不同,在Visual Studio中加不加#define _GLIBCXX_USE_CXX11_ABI 0都正常運行,不知具體原因。
但在Clion(Windows)下,加不加都出現錯誤
undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits
,可能是Clion忽略了我指定的新版本編譯器,鏈接到舊版本上了,暫時未解決。
在Ubuntu下g++手動編譯,不加#define...正常運行,加了報錯,符合預期
引用
感謝https://zhuanlan.zhihu.com/p/125197727