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就行。
安装步骤:
- 下载工具链:从官方或Linaro官网下载aarch64版本。
- 解压到指定目录:比如
/opt/toolchains/。 - 配置环境变量:把工具链的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)
编译流程:
- 在项目根目录创建
build文件夹。 - 进入
build,运行cmake ..。 - 运行
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的步骤:
- 下载源码:从GitHub下载OpenCV 4.8.0(或你需要的版本)。
- 安装依赖:在主机上装好
libjpeg-dev、libpng-dev等库的ARM版本(或者用交叉编译的版本)。 - 配置CMake:指定工具链文件,关闭不必要的模块(比如GUI、CUDA),开启
CMAKE_INSTALL_PREFIX。 - 编译:
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的步骤:
- 下载源码:从GitHub下载ONNX Runtime 1.15.0。
- 安装依赖:需要
protobuf的交叉编译版本。 - 配置CMake:使用
--build参数,指定--config Release和--aarch64。 - 编译:用
./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 本章知识体系图
下面这张图,帮你理清整个开发环境的结构:
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模型(比如一个恒等映射),看它能不能正常推理。
好,环境配置就到这里。这些工具和库,是咱们后面所有项目的基础。配置好了,后面就顺风顺水;配置不好,后面全是坑。嗯,我建议你花点时间,把每一步都跑通,别着急。