1. 程式人生 > >交叉編譯opencv-2.4.9問題記錄

交叉編譯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

交叉編譯

  1. 解壓: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
  1. 安裝cmake-gui
    sudo apt-get install cmake-gui

  2. 建立build目錄用於編譯、output目錄用於輸出安裝目錄:

    mkdir /opt/opencv2.4.9/build
    mkdir /opt/opencv2.4.9/output
  1. 執行cmake-gui

    • 出現如下介面:
      Cmake介面
    • 點選Browse Source選擇剛剛解壓的opencv2.4.9目錄
    • 點選Browse Build選擇剛剛建立的opencv2.4.9/build目錄
    • 點選configure,此時出現對話方塊:
      configure
    • 選擇Specify options for cross-compilingnext
    • 在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
      錯誤1

      解決方法:
      search中,取消選項:WITH_CUDAWITH_OPENCL,再次configure就不會出現問題。
      參考連結

      在出現的列表中,search對應的文字框中輸入CMAKE_INSTALL_PREFIX,修改為自己的output目錄,我的目錄是/opt/opencv2.4.9/output,如下:
      search

    • Generate——->Generation done,即可關閉cmake軟體

  2. 進入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
  1. 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 againsta local symbol’ can not be used when making a shared object; recompile with -fPIC
博主記:2017/12/25,使用
arm-linux-gnueabihf-gcc編譯opencv2.4.9時出現這個問題。
原因:zlib編譯需要新增
-fPIC選項
解決方法:
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目錄下,也就能夠成功運行了。