OpenCV : undefined reference to cv::imread()

最近在編譯一個小工程時遇到了一個OpenCV的問題,如標題所示找不到函數接口。其實,我們一般遇到“undefined reference to”的錯誤首先想到的肯定是相關的庫沒有正確連接。但是我遇到的問題要比這個奇怪的多。
下面記錄下我的解決思路,做個筆記防止後面在遇到相同的問題。

檢查庫是否正確連接

  1. ldd ****.so可檢查某個庫的依賴情況,重點看那些找不到的庫。如果我們發現某個庫找不到,則有兩種情況:一、在編譯該庫時,依賴庫的路徑沒有指定正確,即編譯時就有錯誤;二、環境變量LD_LIBRARY_PATH中並不包括依賴庫的路徑,也會造成該問題。
  2. 在makefile文件中使用依賴庫的絕對路徑,有時我們在makefile中使用LIBRARY := -lopecv_core的形式添加依賴庫,而這是相對路徑,其庫所在路徑我們一般通過變量LIBS_PATH指定,即到LIBS_PATH指定的路徑內尋找庫libopecnv_core.so庫.有時環境變量LD_LIBRARY_PATH會和LIBS_PATH衝突,即兩個路徑下可能都包含我們要找的庫,這時很有可能就找到錯誤路徑上了,因此爲了避免這種情況,我們可以使用依賴庫的絕對路徑。如下所示LIBRARIES := -L. /usr/local/lib/libopencv_core.so.3.4
  3. 如果我們發現缺少某個庫,但是又不能確定該庫的位置,我們可以使用locate命令確定該庫的路徑。找到依賴庫後,我們可以將其路徑增加到環境變量LD_LIBRARY_PATH中,也可以將其絕對路徑添加到makefile中。

CXX11

如果我們在錯誤中發現有CXX11的字樣,我們可以參考片博客
一下內容版權歸上述博客作者所有,我只是複製粘貼過來。

  • 原因:
    注意上面的那個__cxx11。舊版本編譯器編譯出來的代碼中,不會有這個符號。
    用於編譯該代碼的gcc編譯器的版本是5.5.0,而該代碼所需要的opencv所使用的編譯器的版本是4.8.0
  • 解決辦法:
    第一種:在編譯的時候加上-D_GLIBCXX_USE_CXX11_ABI=0即可(參考《g++命令行參數》的-Dmacro=defn部分)。
    第二種:在每個源文件中添加一個宏定義:# define _GLIBCXX_USE_CXX11_ABI 0

檢查頭文件,檢查頭文件,檢查頭文件

重要的事情說三遍,當我們改變了庫的版本後,切記要檢查頭文件是否和版本相對應。
我在遷移時,將opencv的版本由2.10升級到3.4。opencv3.4的庫和opencv2.10的庫已經有所不同,注意libopencv_imgcodecs.so.3.4的添加。可參考這篇博客
我的最終問題是,我雖然添加了相應的庫,而且頭文件也按照上篇博客改正了,但是還是報錯。主要原因就是我的頭文件是opencv2.10的,版本不對應,修改成opencv3.4的頭文件即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章