OpenCV 之交叉编译及 ARM 移植 cmake-gui 教程
2023-6-21
| 2023-6-21
0  |  0 分钟
type
status
date
Jun 21, 2023 09:35 AM
slug
summary
tags
category
icon
password
  • 目的:将 OpenCV 移植到 ARM 板上
  • PC 操作系统:VMWare 虚拟机上安装的 Ubuntu 20.04(x86_64)
  • OpenCV 版本:3.4.12
  • 交叉工具链:arm-linux-gnueabihf,gcc version 9.3.0
  • 目标平台:arm 板
  • 编译时间:2021.08.20
所谓的将 OpenCV 移植到某个平台,就是用该平台对应的编译器将 OpenCV 源代码编译成 so 库OpenCV 里面有很多库,这些库封装了我们想要的一些功能,但它只提供了源码工程,需要我们编译以后,去执行它的入口代码函数。

0、序言

【gcc、make、makefile、cmake、CMakeList.txt 说明】
1)gcc
它是 GNU Compiler Collection(GNU 编译器套件),可以简单认为是编译器,可以编译很多编程语言:C、C++、Fortran、Java 等。
我们的程序只有一个源文件时,直接可以用 gcc 命令编译它。但包含很多个源文件时,用 gcc 命令逐个去编译就会工作量巨大且很混乱,于是就出现了 make 工具。
2)make
make 工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是类似批处理的方式通过调用 makefile 文件中用户指定的命令来进行编译和链接的。
3)makefile
make 工具可以比作乐团的指挥家,makefile 就像一首歌的乐谱,指挥家根据乐谱来指挥整个乐团该怎样演奏,make 工具就是根据 makefile 中的命令进行编译和链接的,makefile 命令中就包含了调用 gcc(也可以是别的编译器)去编译某个源文件的命令。
在一些简单的工程中可以人工的处理 makefile,当工程非常大的时候,手写就很麻烦;且换个平台 makefile 又要重新修改,于是就出现了 cmake 工具。
4)cmake
cmake 工具可以更加简单的生成 makefile 文件给上面的 make 用。当然 cmake 还有更牛的功能就是可以跨平台的生成对应平台能用的 makefile。
但 cmake 又是根据什么生成 makefile 的呢?是根据一个叫 CMakeList.txt 文件(学名:组态档)去生成 makefile。
5)CMakeList.txt
CMakeList.txt 就是用户自己手写的了。
PS:在 cmake 后会输出一些编译信息,并生成一些中间文件,最重要的就是 makefile 文件。其他的一些中间文件在发布代码时是可删除,不需要的,因此可以通过新建一个中间目录(文件夹)专门存放这些中间文件,编译成功后直接删除这个中间目录就可以了。一般是新建一个中间目录 build。(注意此时在终端中运行程序时,也需要使终端 cd 在 build 中间目录中)

一、下载 OpenCV 源码

二、下载交叉编译的 ARM 库

编译在 PC 上,编译运行的目标平台是 ARM 平台,需要下载 ARM 库所依赖的文件资料,以使得 PU Ubuntu 上编译出来的 OpenCV 能在 ARM 平台上顺利跑起来。
注意:需确认系统是 32 位还是 64 位,选择对应版本的交叉编译工具,64 位系统没安装 32 位运行库就不能运行 32 位软件。

①安装 arm-linux-gcc

②安装 arm-linux-g++

③检测是否安装成功

三、配置工具链

①新建 build 目录

用于存放编译好的配置文件等信息

②安装 cmake-gui

OpenCV 2.2 以后版本需要使用 cmake 生成编译 OpenCV 的 makefile 文件,需要先安装 cmake / cmake-gui。

③工具链配置界面进行配置

1、终端输入以下命令
notion image
说明:
Where is the source code 对应 opencv 的文件夹,Where to build the binaries 对应 opencv 存放编译好的配置文件等信息的文件夹(刚才创建的 build 文件夹)
2、点击 Configure,弹出编译方式选择对话框:
notion image
3、点击 Next:
notion image
说明:Operating System 输入 Linux ;Processor 输入 arm ;C 输入 arm-linux-gnueabihf-gcc 路径:/usr/bin/arm-linux-gnueabihf-gcc;C++ 路径:/usr/bin/arm-linux-gnueabihf-g++;Target Root 输入:/usr/arm-linux-gnueabihf/lib
4、点击 Finish。
5、Search 位置输入 Z,把 zip 库(BUILD_ZLIB 选项)选中(Ubuntu 20.04 不选择可能会报错)。
6、Search 位置输入 install(CMAKE_INSTALL_PREFIX 选项),修改下 opencv 编译后存放的目录路径:这里随便选择一个空的目录即可。
7、点击 Configure。
8、点击 Generate。关闭对话框。

四、编译项目

说明:存放编译后的 opencv 执行文件的目录出现文件表示编译完成。

五、跑一个程序验证

1、创建并编译 helloworld.cpp

简单试验一下

2、检测是否生成 ARM 文件

notion image
可以看到编译后的可执行文件是在 32-bit 的 ARM 架构上运行的。

其他可能出现问题:

1、添加交叉编译器到系统环境变量

notion image
出现以下信息说明安装成功:
notion image

2、修改 CMakeCache.txt 文件

找到 CMAKE_EXE_LINKER_FLAG:STRING=
修改为 CMAKE_EXE_LINKER_FLAG:STRING=-lpthread -ldl -lrt
意思是:-lpthread 支持线程;-ldl 避免未定义 dlopen;-lrt 避免未定义 > 本文由简悦 SimpRead 转码
技术折腾
  • Python
  • Raspberry
  • 折腾
  • 图像编程
  • 开发
  • 工具
  • 组织ubuntu20.04 安装 qt 的曲折过程
    目录