rk1108交叉编译opencv-3.4.6过程记录

  1. ubuntu16.04 x64系统,搭建好rk1108开发板的交叉编译环境,并设置交叉编译器环境变量。
  2. 下载压opencv-3.4.6.zip压缩包并解压,下载链接: https://github.com/opencv/opencv/releases/tag/3.4.6
  3. unzip opencv-3.4.6.zip
    cd opencv-3.4.6
    mkdir build
    cmake-gui
    使用cmake-gui进行设置,步骤如下,如下图1所示,选择生成Makefile的类型:
    rk1108交叉编译opencv-3.4.6过程记录
    图1
    如下图2所示,配置交叉编译器的路径,图中Operating System请务必填写Linux,设置完毕后,单击finish,结束编译器配置过程,出现图3所示界面。
    rk1108交叉编译opencv-3.4.6过程记录
    图2
    rk1108交叉编译opencv-3.4.6过程记录
    图3
    依照以下图4,5,6,7片所示,进行配置项设置:
    rk1108交叉编译opencv-3.4.6过程记录
    图4
    rk1108交叉编译opencv-3.4.6过程记录
    图5 (安装路径设置,建议修改一下安装路径,参考上图5)
    rk1108交叉编译opencv-3.4.6过程记录
    图6
    rk1108交叉编译opencv-3.4.6过程记录
    图7
    按照上述步骤,完成配置
  4. 编译opencv:make -j4
    编译过程会出现如下error:
    rk1108交叉编译opencv-3.4.6过程记录
    图8
    解决方式如下:
    vim ${HOME}/opencv-3.4.6/3rdparty/libpng/pngpriv.h
    注释掉一行:
    /*# if (defined(ARM_NEON) || defined(__ARM_NEON)) && \ */
    并添加一行:
    #if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) &&
    修改完成后,继续执行:make -j4 知道编译完成。
  5. 安装opencv: sudo make install,安装完成后,可在安装路径看到如下库函数:
    rk1108交叉编译opencv-3.4.6过程记录
    图9

注:之前交叉编译完成后,使用opencv时,总会报如下的警告:
warning: …/…/lib/libopencv_imgproc.so, needed by …/lib/libopencv_imgcodecs.so, not found (try using -rpath or -rpath-link)
使用命令查看:readelf -d libopencv_imgproc.so | grep NEEDED

0x00000001 (NEEDED) 共享库:[…/…/lib/libopencv_core.so]
0x00000001 (NEEDED) 共享库:[libstdc++.so.6]
0x00000001 (NEEDED) 共享库:[libm.so.0]
0x00000001 (NEEDED) 共享库:[libgcc_s.so.1]
0x00000001 (NEEDED) 共享库:[libc.so.0]

尝试了多种编译方式,最终得以解决,具体解决办法:
需要保证在开始设置的时候 CMAKE_SYSTEM_NAME 是否被设置为Linux 若你的工程中未设置或设置为其它值,建议修改其为 Linux,即图2进行设置的时候,Operating System请务必填写Linux,设置后,完成编译。
使用命令查看: readelf -d libopencv_imgproc.so

Dynamic section at offset 0x310478 contains 33 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libopencv_core.so.3.4]
0x00000001 (NEEDED) Shared library: [libdl.so.1]
0x00000001 (NEEDED) Shared library: [libpthread.so.1]
0x00000001 (NEEDED) Shared library: [librt.so.1]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.1]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.1]
发现…/…/lib路径没有了,直接依赖当前文件夹下的文件。

交叉编译opencv时常用到,在此记录,给自己做个参考!