2017-06-06 159 views
0

所以我不是在計算機上工作,而是在運行Ubuntu的嵌入式設備上。Linux編譯 - 衝突的庫

我想編譯openCV代碼,但我感覺我處於僵局之中!

這是我的錯誤: 問題:

/usr/bin/ld: warning: libopencv_core.so.3.2, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_core.so.2.4 
/usr/bin/ld: /tmp/ccYlsBYW.o: undefined reference to symbol '_ZN2cv11setIdentityERKNS_17_InputOutputArrayERKNS_7Scalar_IdEE' 
/usr/local/lib//libopencv_core.so.3.2: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

重命名2.4庫:

[email protected]:/usr/lib$ sudo mv libopencv_core.so libopencv_core.soMyOld 
[email protected]:/usr/lib$ sudo mv libopencv_core.so.2.4 libopencv_core.so.2.4MyOld 
[email protected]:/usr/lib$ sudo mv libopencv_core.so.2.4.10 libopencv_core.so.2.4.10MyOld 

重新編譯代碼

/usr/bin/ld: warning: libopencv_core.so.2.4, needed by /usr/lib/gcc/arm-linux-gnueabihf/4.8/../../../../lib/libopencv_imgproc.so, not found (try using -rpath or -rpath-link) 
/usr/bin/ld: warning: libopencv_imgproc.so.3.2, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_imgproc.so.2.4 
/usr/bin/ld: /tmp/ccmcvWug.o: undefined reference to symbol '_ZN2cv6circleERKNS_17_InputOutputArrayENS_6Point_IiEEiRKNS_7Scalar_IdEEiii' 
/usr/local/lib//libopencv_imgproc.so.3.2: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

重命名3.2庫:

[email protected]:/usr/local/lib$ sudo mv libopencv_core.so 
[email protected]:/usr/local/lib$ sudo mv libopencv_core.so.3.2 libopencv_core.so.3.2MyOld 
[email protected]:/usr/local/lib$ sudo mv libopencv_core.so.3.2.0 libopencv_core.so.3.2.0MyOld 

重新編譯

/usr/bin/ld: warning: libopencv_core.so.3.2, needed by //usr/local/lib/libopencv_imgcodecs.so, not found (try using -rpath or -rpath-link) 
/usr/bin/ld: warning: libopencv_imgproc.so.3.2, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_imgproc.so.2.4 
/usr/bin/ld: /tmp/cclHSHtB.o: undefined reference to symbol '_ZN2cv6circleERKNS_17_InputOutputArrayENS_6Point_IiEEiRKNS_7Scalar_IdEEiii' 
/usr/local/lib//libopencv_imgproc.so.3.2: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

我能做些什麼來解決這個問題?一切卸載並重新安裝是不是一種選擇...

編輯:

我用這個命令編譯:

g++ src/personDetection.cpp src/personRecognition.cpp main.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_video -lopencv_videoio -pthread -o main 
+0

我想你是在一個tegra板上。也許你應該刪除默認安裝的OpenCV庫:'OpenCV4Tegra'。 – nglee

+0

@devnglee「也許」?你爲什麼不確定?順便說一句,錯誤不是關於opencv版本4,就像你指的那樣,在我的主板上沒有安裝openCV的默認設置。 – LandonZeKepitelOfGreytBritn

+0

'opencv4tegra'代表tegra的opencv。忘記,如果你的董事會沒有。所以你已經安裝了2.4並試圖安裝3.2? – nglee

回答

1

-L選項用於指定目錄路徑。編譯器將使用其他系統標準目錄(如LIBRARY_PATH中的目錄)搜索此目錄。 但它會搜索-L首先指定的目錄

-l選項用於指定庫的名稱名稱

在你的情況,2.4版本庫在/usr/lib和3.2版本庫在/usr/local/lib。您的代碼可能是2.4版本,但您的系統可能會設置搜索/usr/local/lib,然後再搜索/usr/lib,這可能是您問題的原因。

通過指定-L/usr/lib您告訴編譯器首先搜索/usr/lib,從而導致使用2.4版本的庫。


UPDATE

$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$' 

上面的命令會顯示默認的列表鏈接時搜索的目錄。 (複製來自this article的命令)

在我的機器(Ubuntu 16.04,64位)中,/usr/local/lib出現在/usr/lib之前。這意味着/usr/local/lib中的庫可以覆蓋/usr/lib中的庫。 (link