第三章:C++开发环境搭建
好,咱们直接进入正题。这一章我要带你搞定C++开发环境。说实话,很多新手在环境搭建上就卡住了,后面学得再起劲也跑不起来代码。我当年刚接触嵌入式时,光配交叉编译链就折腾了两天。嗯,今天咱们把这些坑都填平。
3.1 GCC/G++编译器安装
GCC是Linux下的标准C/C++编译器。G++就是它的C++版本。说白了,你写的代码要变成机器能跑的东西,就得靠它。
安装命令(Ubuntu/Debian系):
sudo apt update
sudo apt install build-essential
sudo apt install g++-arm-linux-gnueabihf # 交叉编译用
装完后验证一下:
g++ --version
arm-linux-gnueabihf-g++ --version
我的经验: 我个人习惯装g++-9或g++-10版本。太新的版本有时对旧板子的兼容性不好。我在项目中遇到过g++-11编译出的程序在ARM Cortex-A7上跑出段错误,降级到g++-9就没事了。
3.2 CMake工具安装与配置
CMake是跨平台的构建工具。你想想看,没有它的话,你得手写Makefile,那玩意儿写起来真让人头大。CMake帮你自动生成Makefile,省心不少。
安装:
sudo apt install cmake
cmake --version # 确认版本,建议3.16以上
一个简单的CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.10)
project(yolo_deploy)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCV REQUIRED)
find_package(ncnn REQUIRED)
add_executable(yolo_infer main.cpp)
target_link_libraries(yolo_infer ${OpenCV_LIBS} ncnn)
注意: 交叉编译时,CMake需要指定工具链文件。我曾经因为忘记设置CMAKE_SYSROOT,导致链接了宿主机的库,程序在板子上直接崩溃。这个坑我踩过,你别再踩了。
3.3 VS Code或CLion IDE配置
编辑器这块,我推荐VS Code。轻量、插件丰富。CLion也很好,但收费且吃内存。咱们做嵌入式,很多时候在远程服务器上开发,VS Code的Remote-SSH插件简直神器。
VS Code必备插件:
- C/C++(微软官方)
- CMake Tools
- Remote - SSH(远程开发用)
- GitLens(看代码历史)
配置c_cpp_properties.json:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include",
"/opt/ncnn/include"
],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
小技巧: 我习惯在VS Code里同时打开本地代码和远程板子的终端。一边改代码,一边ssh到板子上编译运行,效率很高。你试试看。
3.4 交叉编译工具链介绍
交叉编译,说白了就是在你的电脑上编译出能在ARM板子上跑的程序。为什么需要它?因为大多数边缘设备性能太弱,根本跑不动编译器。
常见工具链:
| 架构 | 工具链前缀 | 常见设备 |
|---|---|---|
| ARM 32位 | arm-linux-gnueabihf- | 树莓派3B+、全志H3 |
| ARM 64位 | aarch64-linux-gnu- | 树莓派4B、RK3399 |
| RISC-V 64位 | riscv64-linux-gnu- | K210、全志D1 |
验证交叉编译是否成功:
# 写一个简单的hello.cpp
#include <iostream>
int main() {
std::cout << "Hello from ARM!" << std::endl;
return 0;
}
# 用交叉编译器编译
arm-linux-gnueabihf-g++ hello.cpp -o hello_arm
# 查看文件信息
file hello_arm
# 输出应该包含 ARM 字样
避坑指南: 我曾经在交叉编译OpenCV时,忘记指定-DCMAKE_INSTALL_PREFIX,结果库装到了系统目录,导致板子上链接时找不到。记住:交叉编译的库一定要单独安装到自定义路径,比如/opt/arm-opencv。
3.5 实战:搭建一个完整的Yolo部署环境
好,理论说完了,咱们动手。下面是我个人常用的环境搭建流程:
- 安装基础工具: g++, cmake, git, wget
- 下载ncnn库: 这是腾讯开源的推理框架,对ARM优化很好
- 交叉编译ncnn: 用cmake指定工具链
- 编译Yolo示例: 链接ncnn和OpenCV
交叉编译ncnn的CMake命令:
mkdir build-arm && cd build-arm
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/opt/ncnn-arm \
..
make -j4
make install
核心要点: 交叉编译时,所有第三方库(ncnn、OpenCV、protobuf)都必须用同一套工具链编译。混用不同工具链编译的库,链接时会出现各种诡异错误。我吃过这个亏,你记住就行。
嗯,到这里环境就搭好了。下一章咱们开始写真正的Yolo推理代码。到时候你会发现,环境搭好了,后面的事情就顺了。
最后提醒: 如果你用的是CLion,记得在Settings -> Toolchains里添加交叉编译工具链。VS Code的话,在CMake Tools插件里选择对应的Kit就行。我个人更倾向VS Code,因为轻量,而且远程开发方便。
好了,这一章就到这里。有问题随时问我。咱们下一章见。
公众号:蓝海资料掘金营,微信deep3321