交叉编译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

    • 出现如下界面:
      交叉编译opencv-2.4.9问题记录_第1张图片
    • 点击Browse Source选择刚刚解压的opencv2.4.9目录
    • 点击Browse Build选择刚刚建立的opencv2.4.9/build目录
    • 点击configure,此时出现对话框:
      交叉编译opencv-2.4.9问题记录_第2张图片
    • 选择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
      交叉编译opencv-2.4.9问题记录_第3张图片

      解决方法:
      search中,取消选项:WITH_CUDAWITH_OPENCL,再次configure就不会出现问题。
      参考链接

      在出现的列表中,search对应的文本框中输入CMAKE_INSTALL_PREFIX,修改为自己的output目录,我的目录是/opt/opencv2.4.9/output,如下:
      交叉编译opencv-2.4.9问题记录_第4张图片

    • 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目录下,也就能够成功运行了。

你可能感兴趣的:(opencv)