交叉編譯opencv-2.4.9問題記錄
目錄
前言
從來不懂影象演算法,但是為了功能,只能硬著頭皮研究opencv,工作了才知道其實生活才剛剛開始,未來是坎坷而光明的吧!
本篇部落格原來參考易百納論壇,但隨著使用各種編譯鏈編譯之後,發現了許多編譯執行的其他問題,以後這篇博文專門用於記錄opencv2.4.9
相關的交叉編譯問題
原部落格名稱Hi3519V101移植opencv-2.4.9
環境
PC:Ubuntu16.04
交叉編譯工具鏈:arm-hisiv500-linux
OpenCV版本:opencv-2.4.9.zip
交叉編譯
- 解壓:
unzip opencv-2.4.9.zip
cmd:tree -L 1
.
├── 3rdparty
├── apps
├── cmake
├── CMakeLists.txt
├── data
├── doc
├── include
├── index.rst
├── LICENSE
├── modules
├── platforms
├── README.md
└── samples
安裝cmake-gui
sudo apt-get install cmake-gui
建立build目錄用於編譯、output目錄用於輸出安裝目錄:
mkdir /opt/opencv2.4.9/build
mkdir /opt/opencv2.4.9/output
執行
cmake-gui
- 出現如下介面:
- 點選
Browse Source
選擇剛剛解壓的opencv2.4.9目錄 - 點選
Browse Build
選擇剛剛建立的opencv2.4.9/build目錄 - 點選
configure
,此時出現對話方塊:
- 選擇
Specify options for cross-compiling
,next
- 在Operating System填寫 arm-hisiv500-linux
C填寫arm-hisiv500-linux-gcc
C++填寫arm-hisiv500-linux-g++ 點選
configure
,直到出現Configuration done
問題:
Error in configuration process,project files may be invalid
解決方法:
在search
中,取消選項:WITH_CUDA
和WITH_OPENCL
,再次configure
就不會出現問題。
參考連結在出現的列表中,
search
對應的文字框中輸入CMAKE_INSTALL_PREFIX
,修改為自己的output目錄,我的目錄是/opt/opencv2.4.9/output
,如下:
Generate——->Generation done,即可關閉cmake軟體
- 出現如下介面:
- 進入build目錄執行make
cd /opt/opencv2.4.9/build
make
問題1:
../../lib/libopencv_core.so:對‘pthread_once’未定義的引用
../../lib/libopencv_core.so:對‘pthread_spin_lock’未定義的引用
../../lib/libopencv_core.so:對‘pthread_spin_unlock’未定義的引用
../../lib/libopencv_core.so:對‘pthread_spin_init’未定義的引用
../../lib/libopencv_core.so:對‘pthread_spin_trylock’未定義的引用
../../lib/libopencv_core.so:對‘pthread_spin_destroy’未定義的引用
解決方法:
vi CMakeCache.txt
#找到CMAKE_EXE_LINKER_FLAGS,修改如下:
CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt
make install
之後,在/opt/opencv2.4.9/output
目錄下會生成安裝編譯好的庫
總結
遇到Error in configuration process,project files may be invalid
問題的時候還以為是cmake-gui的問題,以前編譯成功後沒有記錄,結果忘記怎麼解決這個問題了,甚至還過載了Ubuntu16.04,所以不做記錄真的是一件很沒有效率的事情,謹記教訓,勇敢前行!
補充
問題2:gnueabihf/bin/ld: ../../3rdparty/lib/libzlib.a(crc32.obj): relocation R_ARM_THM_MOVW_ABS_NC against
a local symbol’ can not be used when making a shared object; recompile with -fPIC
arm-linux-gnueabihf-gcc
博主記:2017/12/25,使用編譯opencv2.4.9時出現這個問題。
-fPIC
原因:zlib編譯需要新增選項
vi 3rdparty/zlib/CMakeFiles/zlib.dir/flags.make
解決方法:
C_FLAGS=-W -Wall…
新增:為
C_FLAGS = -O3 -fPIC -W -Wall…`
同理,後面編譯出現同樣問題如下:
relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
解決方法同上。注意:修改有一定要make clean
後再重新make -j4
問題3:
error while loading shared libraries: ../../lib/libopencv_imgproc.so: cannot open shared object file: No such file or directory
博主在使用arm-linux-gnueabihf
交叉編譯鏈編譯opencv2.4.9
成功之後,滿心歡喜的把編譯好的庫放到開發板上執行,但是執行出現不能找到libopencv_imgproc.so
的問題,原因使用readelf -d libopencv_imgproc.so
得到如下結果:
0x00000001 (NEEDED) 共享庫:[../../lib/libopencv_imgproc.so]
0x00000001 (NEEDED) 共享庫:[../../lib/libopencv_core.so]
0x00000001 (NEEDED) 共享庫:[libstdc++.so.6]
0x00000001 (NEEDED) 共享庫:[libm.so.6]
0x00000001 (NEEDED) 共享庫:[libgcc_s.so.1]
0x00000001 (NEEDED) 共享庫:[libc.so.6]
0x0000000c (INIT) 0x39798
0x0000000d (FINI) 0xfec88
0x00000019 (INIT_ARRAY) 0x1bd000
0x0000001b (INIT_ARRAYSZ) 172 (bytes)
0x0000001a (FINI_ARRAY) 0x1bd0ac
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x00000004 (HASH) 0x118
0x00000005 (STRTAB) 0x1458c
0x00000006 (SYMTAB) 0x5bac
0x0000000a (STRSZ) 105967 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000003 (PLTGOT) 0x1bf910
0x00000002 (PLTRELSZ) 11824 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x36968
0x00000011 (REL) 0x30198
0x00000012 (RELSZ) 26576 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x300b8
0x6fffffff (VERNEEDNUM) 4
0x6ffffff0 (VERSYM) 0x2e37c
0x6ffffffa (RELCOUNT) 654
0x00000000 (NULL) 0x0
也就是說libopencv_imgproc.so
本身自帶路徑,然後用了各種方法都沒有效果。後來研究了一下../../lib/libopencv_imgproc.so
,嘗試把編譯的庫放置在/lib目錄下,結果程式成功執行。
原因也很簡單,如果在/lib目錄下,../../lib/libopencv_imgproc.so
最終還是到/lib目錄下,也就能夠成功運行了。