在Windows下交叉编译和调试树莓派软件

本文提供了利用VSCODE+CMAKE在Windows下交叉编译树莓派程序的方法,分别使用本地环境和WSL两种环境两种方式。以及远程调试的方法。

一、Windows下编译树莓派程序

和在Windows下用Mingw编译Windows程序没什么区别,只是生成的东西是树莓派的软件。Host是Windows, Target是ARM Linux。

  1. 安装编译器。
    到这里下载编译器:raspberry编译器下载
  2. 安装CMAKE
  3. VSCODE 安装CMAKE Tools
  4. 按F1, 输入CMAKE: Quick Start生成CMakeLists.txt
  5. 跨平台编译,要在CMakeLists.txt的最上面加两行指定目标系统和架构,如下(最后一行设置rpath,Windows习惯了喜欢动态库和可执行放在一个文件夹)
    1
    2
    3
    set(CMAKE_SYSTEM_NAME Linux)
    set(CMAKE_SYSTEM_PROCESSOR arm)
    set(CMAKE_BUILD_RPATH "./")

二、用WSL来编译树莓派程序

我还有个Respberry Zero,要重新找编译器(疑问,搞不懂官方的系统镜像怎么做到同时适配Zero和4B的?)。
在网上又找到了一个编译器:另一个respberry编译器下载。版本比较新,GCC 10.3.0支持到C++20,我喜欢。

题外话,如果要编译编译器那是一个大工程,可以用这个项目:crosstool-NG。人生苦短,能用就行。

这个编译器是Linux的,编译个树莓派程序还要装个Linux?抓耳挠腮一番突然反应过来,Windows10不就是“最好的Linux发行版”之一吗? ( •̀ .̫ •́ )✧
话不多说,立马打开WSL(我用Ubuntu,装WSL是另一个话题,网上很多,按下不表)。

  1. 把编译器拷进WSL,解压tar -zxvf cross-pi-gcc-10.3.0-0.tar.gz
  2. 手动放到/opt目录,这步只是为了看上去像那么回事一点
  3. 把要编译的源码也拷进来
  4. 安装CMake
  5. 运行VSCODE,连接WSL (需要Remote - WSL扩展)
  6. 在VSCODE里打开源码,提示说要为WSL安装扩展,那就装,直接C/C++ Extension Pack装上齐活。
  7. 不出意外,CMake扫描不到我们下载的跨平台编译器。 按F1, 输入命令>cmake: edit user-local cmake kits,我们自己加一个。 注意路径文件写你自己的
    1
    2
    3
    4
    5
    6
    7
    {
    "name": "GCC 10.3.0 armv6l-linux-gnu",
    "compilers": {
    "C": "/opt/cross-pi-gcc-10.3.0-0/bin/arm-linux-gnueabihf-gcc",
    "CXX": "/opt/cross-pi-gcc-10.3.0-0/bin/arm-linux-gnueabihf-g++"
    }
    }
  8. 重新启动VSCODE,选择自己加进来的这个编译器。
  9. CMAKE自动开始配置,我的配置完了提示说啥Error: spawn arm-linux-gnueabihf-gcc ENOENT错误之类的云云,无视之。
  10. 可以编译了,复制到ZERO里运行看看吧

三、通过gdbserver远程调试

在VSCODE的Run and Debug中,可以生成launch.json文件,里面这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "remote_debug_demo",
"type": "cppdbg",
"request": "launch",
// 你的程序名,比如我的是demo
"program": "${workspaceFolder}/build/demo",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/build/",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "gdb pretty",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// 这里是跨平台编译器带的GDB
"miDebuggerPath":"/opt/cross-pi-gcc-10.3.0-0/bin/arm-linux-gnueabihf-gdb",
// 这里是树莓派的IP地址和gdbserver的端口
"miDebuggerServerAddress":"192.168.2.226:2000"
}
]
}
  1. 在树莓派中,安装gdbserver
  2. 程序编译成DEBUG版,并复制到树莓派中,以我的demo程序为例
  3. 执行gdbserver 0.0.0.0:2000 ./demo,启动软件开始调试demo程序。
  4. 在VSCODE中,按F5连接到树莓派调试。

    题外话:我启动时遇到了gdb缺少依赖的情况,可以用ldd arm-linux-gnueabihf-gdb命令查看缺少什么。对照着装就可以。
    我装了sudo apt install libpython2.7 libncurses5后搞定。