C 類庫版本不同導致的OpenCV編譯鏈結錯誤

2021-09-26 23:07:46 字數 1460 閱讀 7376

gcc4和gcc5使用的c++標準庫下,string的名字不一樣,導致鏈結錯誤。

之前在ubuntu下使用opencv的時候一切正常。後來再次編譯的時候,聯結器提示有些庫函式找不到:

main.o:在函式『main』中:

main.cpp:15:對『cv::imread(std::stringconst&, int)』未定義的引用

main.cpp:22:對『cv::namedwindow(std::stringconst&, int)』未定義的引用

main.cpp:23:對『cv::imshow(std::stringconst&, cv::_inputarray const&)』未定義的引用

collect2: error: ld returned 1exitstatus

原始檔裡還使用了其他的庫函式,為什麼只有這幾個函式找不到?後來排除了大量錯誤,確定不是因為找不到庫檔案,坑爹的bug。。。

對輸出的目標檔案進行分析,列出其符號表:nm -c main.cpp.o,發現它引用了外部的符號:

...

u cv::imread(std::stringconst&, int)

u cv::namedwindow(std::stringconst&, int)

u cv::imshow(std::stringconst&, cv::_inputarray const&)

...

查詢資料,得知這些函式來自opencv_highgui庫檔案(/usr/lib/x86_64-linux-gnu/libopencv_highgui.so),同樣可以列出它的符號表nm -c opencv_highgui.a(對應的靜態庫):

...0000000000000000t cv::imread(std::__cxx11::basic_string, std::allocator> const&,

int)0000000000000000t cv::namedwindow(std::__cxx11::basic_string, std::allocator> const&,

int)0000000000000000t cv::imshow(std::__cxx11::basic_string,

std::allocator> const&, cv::_inputarray const&)

能夠看出庫函式的原型,和我自己的程式中的原型不一致。仔細對比,是標準庫string的名字不一樣。我自己的程式裡是std::string在庫里是std::__cxx11::basic_string。

後來才想起,前段時間為了相容matlab安裝了gcc4.9版本(和c++標準庫)。再恢復gcc5.x版本編譯、鏈結,沒有再次出現問題。

因為我的opencv庫是ubuntu官方使用c++5的標準庫編譯出來的,而自己寫的程式是c++4.9的庫。兩個庫里標準庫string的名字在目標**裡不一樣,導致無法鏈結。

gcc(g )編譯器版本不同導致的報錯

linux 環境下 gcc version g version報錯資訊舉例 precompiler linux lib64 libc.so.6 version glibc 2.14 not found required by precompiler linux linux 環境下 檢視報錯庫的描述資...

HashMap的jdk版本不同

關於hashmap,其實在jdk1.8和1.7版本之間的差別還是蠻大的,這幾天在經過認真分析和理解之後,通過實驗將學習成果進行展示。首先提出乙個問題 jdk1.7多執行緒環境下hashmap容易出現死迴圈?public class hashmaptest class hashmapthread ex...

不同版本的python共用乙個opencv

相關參考 unzip opencv 3.3.0.zip cd opencv 3.3.0 cmake d with gtk 2 x on d cmake install prefix usr local make j8 make j8表示開8個執行緒來進行編譯 make install 編譯完成之後o...