环境:
- PC操作系统:Ubuntu 16.04 LTS
- 交叉编译工具:Poky 1.7.0
- cmake:3.13.2
- cmake-gui:3.13.2
准备工作:
一、下载opencv3.4.1源码:
二、创建工作目录及解压:
- 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、配置源码及编译生成文件目录
- 勾选Advanced。
- Where is the source code:输入opencv源码的根目录路径,即根CMakeLists.txt所在目录。
- Where to build the binaries:输入编译生成的中间文件目录路径。
- 然后点击Configure。
- 选择Unix Makefile,即生成在unix下使用的makefile。
- 选择Specify options for cross-compiling,即为交叉编译指定选项。
- Next。
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。
- 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。
(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。
大约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这个可执行文件拷贝到开发板中并执行,如果正常打印出版本号则说明移植成功。