i.MX6 交叉编译opencv3.4.1

环境:

  • PC操作系统:Ubuntu 16.04 LTS
  • 交叉编译工具:Poky 1.7.0
  • cmake:3.13.2
  • cmake-gui:3.13.2

准备工作:

一、下载opencv3.4.1源码:

opencv-3.4.1.zip

二、创建工作目录及解压:

  • buildopencv — 总目录
  • buildopencv/build — 配置生成makefile的目录
  • buildopencv/install — 编译结果安装目录
  • buildopencv/opencv-3.4.1 — 源码解压生成目录(解压时创建)

将opencv-3.4.1.zip复制到buildopencv目录下并解压。

三、配置cmake(可能需要网络)

1、Terminal下进入buildopencv 目录,并打开cmake-gui。

hrx@:~/opencvbuild/build$ cmake-gui

2、配置源码及编译生成文件目录

i.MX6 交叉编译opencv3.4.1_第1张图片

  • 勾选Advanced。
  • Where is the source code:输入opencv源码的根目录路径,即根CMakeLists.txt所在目录。
  • Where to build the binaries:输入编译生成的中间文件目录路径。
  • 然后点击Configure。

i.MX6 交叉编译opencv3.4.1_第2张图片

  • 选择Unix Makefile,即生成在unix下使用的makefile。
  • 选择Specify options for cross-compiling,即为交叉编译指定选项。
  • Next。

i.MX6 交叉编译opencv3.4.1_第3张图片
Operation System: Linux。
Compilers C: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc。
Compilers C++: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++。
Targer Root: /opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
Library Mode: Search only in Target Root。
Include Mode: Search only in Target Root。

i.MX6 交叉编译opencv3.4.1_第4张图片

  • ok。
  • 开始修改其中的编译选项。

3、修改编译选项

(1)第一次修改,Configure一次
CMAKE_CONFIGURATION_TYPES: Release。
CMAKE_CXX_FLAGS:-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7。
CMAKE_INSTALL_PREFIX: /home/hrx/opencvbuild/install。
i.MX6 交叉编译opencv3.4.1_第5张图片

(2)第二次修改,Configure一次
CMAKE_C_FLAGS:-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7。
在这里插入图片描述

(2)第三次修改,Configure两次,Generate一次
BUILD_EXAMPLES: 如果要编译自带的示例工程则勾选。
BUILD_JPEG: 勾选。
BUILD_PNG: 勾选。
INSTALL_C_EXAMPLE: 如果要安装自带的示例工程则勾选。

3、编译选项检查

CMAKE_CXX_COMPLIER: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++,即poky交叉编译工具的g++,以下类似。
CMAKE_C_COMPLIER: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc。
CMAKE_C_FLAGS:-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7。
CMAKE_CXX_FLAGS:-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7。
CMAKE_AR: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar。
CMAKE_CXX_COMPLIER_AR:/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc-ar。
CMAKE_CXX_COMPLIER_ARNLIB:/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc-ranlib。
CMAKE_C_COMPLIER_AR: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc-ar。
CMAKE_C_COMPLIER_ARNLIB: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc-ranlib。
CMAKE_LINKER: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ld。
CMAKE_NM: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-nm。
CMAKE_OBJCOPY: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-objcopy。
CMAKE_OBJDUMP: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-objdump。
CMAKE_RANLIB: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ranlib。
CMAKE_STRIP: /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-strip。
CMAKE_FIND_ROOT_PATH:/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi。
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: ONLY。
CMAKE_FIND_ROOT_PATH__MODE_LIBRARY: ONLY。
CMAKE_FIND_ROOT_PATH__MODE_PROGRAM: BOTH。
CMAKE_CONFIGURATION_TYPES: Release。
CMAKE_INSTALL_PREFIX: /home/hrx/opencvbuild/install。
BUILD_JPEG: 勾选。
BUILD_PNG: 勾选。
CMAKE_SYSTEM_NAME: Linux。

注:如果有编译选项条目变红则再Configure然后Generate,如果不能消除则可能是配置还有其他问题,可以打开opencvbuild/build/CMakeFiles/CMakeError.log查找一下最近一次报出的错误是什么。

4、make

在Generate后/opencvbuild/build下就已经生成了Makefile文件了。
此时进入/opencvbuild/build进行make。
i.MX6 交叉编译opencv3.4.1_第6张图片

大约5分钟过后,报错了。

错误1:

../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_test_core.dir/build.make:539: recipe for target 'bin/opencv_test_core' failed
make[2]: *** [bin/opencv_test_core] Error 1
CMakeFiles/Makefile2:1758: recipe for target 'modules/core/CMakeFiles/opencv_test_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2

解决错误1:
参考解决方法:https://sourceforge.net/p/libpng/bugs/230/
参考对比文件libpng-fix-arm-neon.patch
对/opencvbuild/opencv-3.4.1/3rdparty/libpng/pngpriv.h文件进行修改。

-#  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
+#  if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \

然后再编译。

5、make install

当make成功后执行make install。编译生成的目标文件将会生成在CMAKE_INSTALL_PREFIX: 所设置的目录。

5、移植

  • 打包/opencvbuild/install/lib目录,生成opencvlib.tar.gz文件。
  • 拷贝opencvlib.tar.gz到开发板中的/usr/local/opencvlib目录并解压(自行创建目录以及获取权限),最终的结果是库文件在/usr/local/opencvlib/lib中。
  • 打开开发板中的/etc/ld.so.conf文件,在最后一行将/usr/local/opencvlib/lib路径配置上,sync。
  • 重启,将/opencvbuild/install/bin/opencv_version这个可执行文件拷贝到开发板中并执行,如果正常打印出版本号则说明移植成功。

你可能感兴趣的:(Linux应用开发)