3. 开发环境配置:交叉编译工具链安装、CMake与Makefile入门、OpenCV编译与安装、ONNX Runtime编译与安装

好,咱们进入第三章。这一章说白了,就是给你的开发机装上「武器」,让它在编译代码时,能生成目标板子(比如RK3588、树莓派)能跑的程序。我刚开始搞嵌入式Linux时,最头疼的就是环境配置,动不动就编译报错,一查就是工具链版本不对。嗯,咱们一步步来,把这些坑都填平。

本章核心目标:在x86_64的Ubuntu主机上,搭建一套完整的交叉编译环境,能编译出在ARM64架构上运行的OpenCV和ONNX Runtime库。

3.1 交叉编译工具链安装

交叉编译,说白了就是「在A机器上编译,生成B机器能跑的程序」。咱们的A机器是x86_64的Ubuntu,B机器是ARM64的Linux板子。工具链就是那个「翻译官」。

我个人的习惯是:直接用芯片厂商提供的工具链,比如Rockchip的RK3588,就用它的SDK里自带的gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu。如果你用的是树莓派,用官方提供的gcc-arm-linux-gnueabihf就行。

安装步骤:

  1. 下载工具链:从官方或Linaro官网下载aarch64版本。
  2. 解压到指定目录:比如 /opt/toolchains/。
  3. 配置环境变量:把工具链的bin目录加到 PATH 里。
# 以aarch64-none-linux-gnu为例
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/toolchains/
export PATH=$PATH:/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
# 验证安装
aarch64-none-linux-gnu-gcc --version

小提示:建议把 export PATH=... 这行加到 ~/.bashrc 里,这样每次打开终端就不用重新设了。我曾经因为忘了加,每次编译前都要手动export,烦得很。

3.2 CMake与Makefile入门

Makefile是Linux下最经典的构建工具,但手写太痛苦了。CMake就是它的「高级封装」,你写CMakeLists.txt,它帮你生成Makefile。咱们的项目里,OpenCV和ONNX Runtime都是用CMake构建的,所以必须得会。

一个最简单的CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(HelloEdgeAI)

set(CMAKE_CXX_STANDARD 11)

add_executable(hello main.cpp)

编译流程:

  1. 在项目根目录创建 build 文件夹。
  2. 进入 build,运行 cmake ..。
  3. 运行 make。

你想想看,如果直接写Makefile,你得手动处理依赖、链接库、编译选项,项目一复杂就乱套了。CMake把这些都自动化了。

注意:交叉编译时,不能直接 cmake ..,必须指定工具链文件(toolchain.cmake)。否则CMake会默认用本机的gcc,编译出来的程序在板子上跑不了。

一个交叉编译的toolchain.cmake示例:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-none-linux-gnu-g++)

set(CMAKE_FIND_ROOT_PATH /opt/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

使用时:cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..

3.3 OpenCV编译与安装

OpenCV是图像识别的核心库。在板子上跑,你不能直接用 apt install 装的那个版本,因为那是给x86用的。咱们得自己交叉编译。

编译OpenCV的步骤:

  1. 下载源码:从GitHub下载OpenCV 4.8.0(或你需要的版本)。
  2. 安装依赖:在主机上装好 libjpeg-dev、libpng-dev 等库的ARM版本(或者用交叉编译的版本)。
  3. 配置CMake:指定工具链文件,关闭不必要的模块(比如GUI、CUDA),开启 CMAKE_INSTALL_PREFIX。
  4. 编译:make -j4,然后 make install。
# 在OpenCV源码目录下
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
      -DCMAKE_INSTALL_PREFIX=/opt/opencv_aarch64 \
      -DBUILD_opencv_python2=OFF \
      -DBUILD_opencv_python3=OFF \
      -DBUILD_opencv_gui=OFF \
      -DWITH_CUDA=OFF \
      -DWITH_GTK=OFF \
      -DWITH_V4L=ON \
      -DWITH_LIBV4L=ON \
      ..
make -j4
sudo make install

避坑指南:我曾经编译OpenCV时,忘了关 BUILD_opencv_gui,结果编译到一半报错,说缺GTK库。板子上根本不需要GUI,关了就好。另外,WITH_V4L 一定要开,否则摄像头用不了。

3.4 ONNX Runtime编译与安装

ONNX Runtime是微软出的推理引擎,专门跑ONNX模型。咱们的YOLOv8模型最终会转成ONNX格式,然后用它来推理。交叉编译ONNX Runtime比OpenCV稍微复杂一点,因为它依赖一些第三方库。

编译ONNX Runtime的步骤:

  1. 下载源码:从GitHub下载ONNX Runtime 1.15.0。
  2. 安装依赖:需要 protobuf 的交叉编译版本。
  3. 配置CMake:使用 --build 参数,指定 --config Release 和 --aarch64。
  4. 编译:用 ./build.sh 脚本。
# 在ONNX Runtime源码目录下
./build.sh --config Release \
           --build_shared_lib \
           --parallel 4 \
           --arm64 \
           --cmake_extra_defines CMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
           --cmake_extra_defines CMAKE_INSTALL_PREFIX=/opt/onnxruntime_aarch64

注意:ONNX Runtime的编译脚本会自动下载一些第三方库(比如eigen、nsync)。如果你的网络不好,可能会卡住。我建议先手动下载好这些依赖,放到 cmake/external 目录下,避免重复下载。

编译完成后,你会在 /opt/onnxruntime_aarch64 下看到 include 和 lib 文件夹。这就是咱们后面项目要用到的库。

3.5 本章知识体系图

下面这张图,帮你理清整个开发环境的结构:

开发环境配置知识体系 开发环境配置知识体系 Ubuntu主机 (x86_64) 交叉编译工具链 CMake + Makefile 目标板 (ARM64) OpenCV (ARM64) ONNX Runtime (ARM64) 应用可执行文件 部署到目标板:scp / rsync 说明:所有编译产物最终通过scp或rsync传输到目标板,形成完整的运行环境。

3.6 环境验证清单

配置完环境后,别急着往下走。我建议你做一个快速验证,确保每个环节都没问题。下面这个表格,你可以对照着检查:

组件 验证命令 预期输出
交叉编译工具链 aarch64-none-linux-gnu-gcc --version 显示gcc版本信息(如10.3.1)
CMake cmake --version 显示CMake版本(建议≥3.20)
OpenCV 编译一个测试程序,链接OpenCV,在板子上运行 程序能正常显示图像尺寸
ONNX Runtime 编译一个测试程序,加载ONNX模型,在板子上运行 模型加载成功,推理无报错

我的经验:验证OpenCV时,我通常会写一个简单的程序,读取一张图片,打印它的宽高。如果能在板子上跑通,说明编译环境基本没问题。ONNX Runtime的验证更简单,加载一个最小的ONNX模型(比如一个恒等映射),看它能不能正常推理。

好,环境配置就到这里。这些工具和库,是咱们后面所有项目的基础。配置好了,后面就顺风顺水;配置不好,后面全是坑。嗯,我建议你花点时间,把每一步都跑通,别着急。