第三章: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部署环境

好,理论说完了,咱们动手。下面是我个人常用的环境搭建流程:

  1. 安装基础工具: g++, cmake, git, wget
  2. 下载ncnn库: 这是腾讯开源的推理框架,对ARM优化很好
  3. 交叉编译ncnn: 用cmake指定工具链
  4. 编译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