MultiArch 与 Ubuntu/Debian 的交叉编译(一)

什么是“MultiArch”

OpenCV 可能会使用大量第三方库进行视频和图像解码、渲染、加速和复杂的数学算法。CMake 在构建主机上找到第三方组件,交叉编译允许为外部架构或操作系统构建 OpenCV,但我们失去了庞大的组件世界,必须单独交叉编译每个依赖项并在 OpenCV 构建期间指向它。

Debian/Ubuntu MultiArch 有助于解决这个问题。它允许在主机系统上安装多个外部架构库,并在 OpenCV 依赖项解析期间使用它们。

警告

  • 遵循这些步骤将使您的 Linux 环境有点脏。如果可能,最好使用 VM 或容器(例如 Docker)。
  • 本教程要求主机和目标使用相同的 Ubuntu 版本。不要对外部库依赖使用/混合不同的版本。
    • 好:主机和目标均为 23.04。
    • 好:主机和目标均为 23.10。
    • 不好:主机为 23.04,目标为 23.10。
    • 不好:主机是 23.10,目标是 23.04。
  • 本教程可用于 Debian 及其衍生产品,如 Raspberry Pi OS。请进行任何必要的更改。

下载工具

安装必要的工具和工具链以进行交叉编译。

  • 基本上需要 git、cmake、pkgconf 和 build-essential。
  • ninja-build 是为了减少编译时间(选项)。
  • crossbuild-essential-armhf 是 armv7 目标的工具链包。
  • crossbuild-essential-arm64 是 aarch64 目标的工具链包。
sudo apt 更新 -y
sudo apt 安装 -y \
git \
cmake \
pkgconf \
构建必不可少的\
忍者构建 \
crossbuild-essential-armhf \
交叉构建基本 arm64

如果要启用 Python 3 包装器,也请安装这些包。

sudo apt 安装 -y \
python3-最小 \
python3-numpy

工作文件夹结构

在本教程中,使用以下工作文件夹结构。

/家
+ KMTR - 请替换您的帐户名称。
+ 工作
+ opencv - 源代码,从 GitHub 克隆
+ opencv_contrib - 源代码,从 GitHub 克隆
+ build4-full_arm64 - 工件(用于 aarch64 目标),由 cmake 创建
+ build4-full_armhf - 工件(用于 armhf 目标),由 cmake 创建
  1. 在主目录下创建工作文件夹。
  2. 将 OpenCV 和 OpenCV Contrib 从存储库克隆到工作目录。
cd ~
mkdir 工作
CD作品
git clone --depth=1 https://github.com/opencv/opencv.git
git clone --depth=1 https://github.com/opencv/opencv_contrib.git

更新 apt 和 dpkg 设置

这些步骤在主机上执行。

apt并且是 Ubuntu 和 Debian 中使用的包管理系统。dpkg

以下是使用 MultiArch 的设置步骤。

步骤 1。为 arm64 和 armhf 添加 apt source

执行以在文件末尾添加外部 arch 库。sudo apt edit-sources

示例 1:适用于 Ubuntu 23.04 的 arm64 和 armv7

deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球主限制
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球更新宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球多元宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球更新多元宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球后港主要受限宇宙多元宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球安全主要受限制
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球安全宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports 月球安全多元宇宙

示例 2:适用于 Ubuntu 23.10 的 arm64 和 armv7

deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic 多元宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates 多元宇宙
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security 多元宇宙

第2步。更新 apt 数据库

更新 apt 数据库以应用新的 apt 源。

执行。sudo apt update

sudo apt 更新

第 3 步。更新 dpkg 设置

更新 dpkg 设置以支持外部架构。

执行和/或 .sudo dpkg --add-architecture arm64sudo dpkg --add-architecture armhf

sudo dpkg --add-architecture arm64
sudo dpkg --add-architecture armhf

sudo dpkg --print-architecture显示了什么是主机体系结构。

sudo dpkg --打印架构
AMD64的

并显示支持哪些外部架构。sudo dpkg --print-foreign-architectures

sudo dpkg --print-foreign-architectures
arm64的
阿姆赫夫

确认工作正常 pkg-config

在 MultiArch 中,每个架构的几个共享库和 pkg-config 信息都存储在 /usr/lib 中。

/usr
+ 库
+ aarch64-linux-gnu - arm64 的共享库
+ pkgconfig - arm64 库的 pkg-config 文件
+ arm-linux-gnueabihf - armhf 的共享库
+ pkgconfig - armhf 库的 pkg-config 文件
+ 分享
+ pkgconfig - pkg-config 文件(用于头文件)

使用 和 选项确认工作。pkg-configPKG_CONFIG_PATHPKG_CONFIG_LIBDIRPKG_CONFIG_SYSROOT_DIR

对于 aarch64:

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --列表-all

对于 ARMv7:

PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --列表-all

   在线教程

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

请添加图片描述

人工智能书籍

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

 有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

 

### 设置 STM32H743 交叉编译环境 #### 配置开发主机环境 为了能够顺利地为STM32H743微控制器编写并编译程序,需要先安装必要的工具链和支持库。对于Linux平台而言,可以利用预构建好的工具包来简化这过程。 针对特定架构的环境变量配置文件位于`/opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi`[^1]。此文件包含了设定目标平台所需的各种参数定义,比如CROSS_COMPILE宏等重要信息。通过将这些设置加入到当前shell会话中,可以使后续命令识别正确的编译器和其他辅助工具的位置。 ```bash source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi ``` 上述指令执行之后,用户的PATH环境变量将会被更新以包含交叉编译所需的二进制文件路径;同时也会设置其他些有用的环境变量以便于链接脚本及其他资源文件能被正确找到。 #### 安装依赖软件包 除了基本的操作系统外,还需要额外安装几个支持性的组件才能完成整个工作流程: * GCC ARM Embedded Toolchain - 提供了完整的GNU编译套件版本,专门优化过适用于ARM Cortex-M系列MCU。 * OpenOCD - 调试工具,配合OpenOCD起使用来进行断点跟踪等功能。 可以通过系统的包管理器获取以上提到的应用程序及其依赖关系。例如,在基于DebianUbuntu发行版上运行如下命令即可满足需求: ```bash sudo apt-get install gcc-arm-none-eabi openocd gdb-multiarch ``` #### 获取项目模板示例代码 官方提供了丰富的例子工程帮助初学者快速入门。可以从ST官方网站下载最新的HAL库和CubeMX生成的基础框架作为起点。此外还有许多开源社区贡献的作品可供学习借鉴。 #### 编写Makefile 创建个简单的Makefile可以帮助自动化项目的构建过程。这里给出段基础结构示意代码片段: ```makefile # Makefile for building an application on the STM32 platform. TARGET = main CC = arm-none-eabi-gcc LDSCRIPT = $(wildcard *.ld) OBJS = $(patsubst %.c,%.o,$(wildcard src/*.c)) $(TARGET).elf: $(OBJS) @echo "Linking $@" $(CC) -T $(LDSCRIPT) -o $@ $^ clean: rm -f *.o *~ core .depend .*swp tags TAGS $(TARGET).elf ``` 这段Makefile假定所有的源码都存放在名为`src`子目录下,并且存在至少个`.ld`结尾的链接描述文件用来指导最终可执行映像地址布局安排。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值