ubuntu 16.04 交叉编译opencv 3.3.1

参考:https://meta.tn/a/31d3937558f20da247695af15df37e4538cc54bb71e63d632e653d82074d0d8d

步骤

1、在opencv源码目录创建arm_build目录(根据需求创建,为了区分x86的build)

2、启动cmake-gui,没有的话自行安装 sudo apt-get install cmake-qt-gui

3、填写第一行(源码路径),第二行(arm_build路径),add entry

NAME=CMAKE_AR;

Type=FILEPATH;

Value= /usr/bin/aarch64-linux-gnu-ar(在命令行输入which aarch64-linux-gnu-ar,即可看到该编译器路径,没有的话自行安装

sudo apt search aarch64 搜索可以安装的版本,这里安装sudo apt-get install g++-5-aarch64-linux-gnu)

ubuntu 16.04 交叉编译opencv 3.3.1_第1张图片

4、点击configure,选择specify toolchain file for cross-compiling,然后设置toolchain file path 为

                                                            opencv(opencv源码目录)/platforms/linux/aarch64-gnu.toolchain.cmake

然后保存回到主界面即可。

ubuntu 16.04 交叉编译opencv 3.3.1_第2张图片

5、点击主界面的advanced选项,可以看到各种配置,找到CMAKE_C_COMPILER和CMAKE_CXX_COMPILER填写aarch64版本的,我这里是在/usr/bin/aarch64-linux-gnu-g++(gcc)-5,根据需要开启c++11(ENABLE__CXX11),另外在CMAKE_CXX_FLAGS填入-std=c++11,以及是否编译shared library,再次点击configure之后,点击generate即可,如果没出错说明成功了。

ubuntu 16.04 交叉编译opencv 3.3.1_第3张图片

我这里出现了错误,cxx_std_11这个标志识别不出来,我在opencv/modules目录下搜索该标志find ./ | xargs grep "cxx_std_11",在一个cmake里找到了,然后将其删除了。

6、进入arm_build目录,使用make -j4 命令多线程编译源码,可能会出现错误,例如,cuda的问题

  Could NOT find CUDA (missing: CUDA_INCLUDE_DIRS) (found suitable exact
  version "8.0")
Call Stack (most recent call first):
  /usr/local/share/cmake-3.11/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/share/cmake-3.11/Modules/FindCUDA.cmake:1085 (find_package_handle_standard_args)
  /home/changkun/opencv/arm_build/OpenCVConfig.cmake:86 (find_package)
  /home/changkun/opencv/arm_build/OpenCVConfig.cmake:105 (find_host_package)
  CMakeLists.txt:17 (find_package)
解决方案,进入vim /usr/local/share/cmake-3.11/Modules/FindCUDA.cmake,找到1085行,使用set(CUDA_INCLUDE_DIRS cuda's path),写死该变量,即可编译通过

7、安装opencv_contrib库

找到 OPENCV_EXTRA_MODULES_PATH 项,选择扩展库源码 opencv_contrib 目录下的 modules 目录

点击 Configure ,生成配置,点击 Generate ,生成 Makefile。进入arm_build目录重新编译opencv即可。

你可能感兴趣的:(ubuntu 16.04 交叉编译opencv 3.3.1)