前置步骤:
安装CLion,参考前文,此处不做展开
最终开发环境:
- CLion2019 3.3
- CMake 3.15.5
- MinGW w64 6.0
- MinGW w64 GDB 8.1
- gcc-arm-9.2-2019.12-mingw-w64-i686-aarch64-none-linux-gnu
- OpenCV 3.4
工具包打包下载链接:百度网盘 提取码:de1t
第一步:安装MinGW-w64
首先安装MinGW-w64,下载完成后,一路默认安装即可。
安装完成后还需要将bin路径添加到环境变量中。后续的CMake等也需要添加到环境变量,这里只展示一次。
控制面板–>(搜索)高级系统设置–>环境变量
在<用户环境变量>分区 –> 新建,名字选择mingw64,路径选择安装文件的bin路径
双击Path变量,在编辑环境变量选项卡中选择新建,填入%mingw64%,点击确定。重启电脑。
在CMD中输入gcc -v,看到版本则代表安装成功。
第二步:安装CMake与ARM交叉编译ToolChains
同MinGW-w64,下载安装完成以后,将bin目录添加到环境变量path中。
在CMD中输入命令cmake –version确认cmake。
输入aarch64-none-linux-gnu-g++确认交叉编译toolchain。
第三步:配置CLion
与前文提到的Ubuntu下CLion配置大同小异,这里放上截图仅供参考。
需要注意的是,在CMakeLists.txt中,需要声明CMAKE_SYSTEM_NAME与CMAKE_SYSTEM_PROCESSOR,否则不会调用交叉编译器。这个参数是利用cmake进行交叉编译必须设置的,通常都是Linux或者Windows,声明要利用cmake创建运行在目标系统上的文件。系统选择Linux,如果要创建运行在没有操作系统的嵌入式环境,该参数要设置成Generic。CMAKE_SYSTEM_PROCESSOR设置为aarch64。否则build会报错Cannot find any CMake profile。另外,CLion的CMake设置也需要修改,CMake options添加-DCMAKE_BUILD_TYPE=Debug。(下图仅写了NAME没有写PROCESSOR,应该写上)
Hello World便可以成功编译了!
第四步:安装OpenCV
- 在OpenCV官网,下载对应版本号的OpenCV,选择windows版本下载。
2. 在解压的目录中,新建cross-build文件夹用于存放一会儿编译后的OpenCV包。
3. 打开cmake-gui,source code选择opencv的sources文件夹,binaries选择cross-build文件夹。
4. 在菜单中选择Tools –> Configure。选择MinGW Makefiles与Specify options for cross-compiling.
5. 笔者的开发板为Linux的Debian10,架构为aarch64,填入对应的信息。Compilers选择之前步骤安装的交叉编译器。
6. 点击finish,开始第一次config,之后再点击一次config直到选项框中没有红色以后,点击Generate,完成编译。
7. 进入编译完成的cross-build文件夹,找到3rdparty/libpng/CMakeLists.txt,在最上面加上:
SET(ARM 1)
SET(ENABLE_NEON 1)
8. 返回cross-build文件夹,进入CMD
mingw32-make
make install
9. 和之前步骤一样,在环境变量中添加opencv。
10. 重启。至此,OpenCV环境就搭建完毕了。
第五步:CLion中读取OpenCV
这里附上CMakeList.txt的写法:
cmake_minimum_required(VERSION 3.15)
#cross compile
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
project(untitled1)
#find opencv
#由于添加了环境变量,因此不需要指定路径
#set(OpenCV_DIR "C:\\DevelopmentEnvironment\\OpenCV3.4.5\\opencv\\cross-build\\install")
#set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "C:\\DevelopmentEnvironment\\opencv-3.4\\aarch_64_install\\share\\OpenCV")
find_package(OpenCV REQUIRED)
#head file
include_directories(${OpenCV_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD 14)
add_executable(untitled1 main.cpp)
#link library
target_link_libraries(untitled1 ${OpenCV_LIBS})
需要注意的是,交叉编译的声明要在项目的声明之前。
Extra:修改OpenCV包使其可在别的设备使用
- 修改OpenCVModules.cmake文件中的IMPORT_LOCATION_RELEASE从绝对路径改为包含{OpenCV_DIR}的相对路径,其中OpenCV_DIR于项目的CMakeList中赋值。
- 修改OpenCVConfig文件中的OpenCV_INCLUDE_DIRS从绝对路径到相对路径
下图仅做举例
项目CMakeList.txt参考,关键是定义包,lib, include的位置
cmake_minimum_required(VERSION 3.15)
#cross compile
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_CXX_STANDARD 14)
project(untitled)
add_executable(untitled main.cpp)
#define opencv location
set(OpenCV_DIR "C:/DevelopmentEnvironment/OpenCV/cross-build")
#find package, include and lib
find_package(OpenCV REQUIRED)
set(OpenCV_INCLUDE_DIRS "C:/DevelopmentEnvironment/OpenCV/cross-build/install/include")
set(OpenCV_LIBRARY_DIRS "C:/DevelopmentEnvironment/OpenCV/cross-build/install/lib")
target_include_directories(untitled PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(untitled PUBLIC ${OpenCV_LIBS})
最后附上一张整体的流程图:
参考
CMake: (三) 交叉编译
https://www.cnblogs.com/flyinggod/p/13713646.html#cmake_system_name
Win10 环境下 Mingw-w64,CMake,CLion 安装及配置 C/C++ 和 OpenCV 运行环境
https://blog.csdn.net/u012005313/article/details/80215957
arm平台交叉编译opencv出现 undefined reference to `png_init_filter_functions_neon’
https://blog.csdn.net/BruceXSK/article/details/105860979
文章评论