由于本文涉及的软件较多,因此不会细讲部分基础操作,所以需要你具备以下软件的使用经历:
- VSCode 编辑器
- Windows Subsystem For Linux(WSL)
- Ubuntu
- C 或 C++
- Make
- CMake
在阅读这篇文章之前,希望你已经看过我之前写的两篇文章
- VSCode 配置 C/C++ 调试
- C/C++ 项目编译实践
本文主要是在这两篇文章的基础上,通过安装 VSCode 插件 Remote - WSL
以及修改 json 配置来实现在 WSL Ubuntu 中调试 C/C++ 程序。
开发环境
我本地的开发环境大致如下:
- Windows 10
- Visual Studio Code(VSCode)
- Windows Terminal
- WSL(Ubuntu 20.04.3 LTS)
- Ubuntu(gcc make cmake)
VSCode 安装 WSL 插件
在 VSCode 的插件市场搜索 Remote - WSL
插件,点击 安装
。
通过 Windows Terminal 终端进入到 WSL Ubuntu 系统,在用户目录下创建一个项目文件夹 mkdir helloWord
,进入文件夹 cd helloWorld
,执行 code .
这个命令,这个命令是让 VSCode 打开当前目录。
如上图,如果 Ubuntu 系统之前没有安装过 VSCode Server,那么 VSCode 就会自动下载并将其安装到你的 Ubuntu 系统中。VSCode 编辑器会与这个 VSCode Server 通信来实现在 Windows 中修改和调试 Ubuntu 中的代码。
等 VSCode Server 安装完成后,再通过 code .
在 Ubuntu 中打开文件夹,就会在 VSCode 编辑器的左下角看到 WSL: Ubuntu
的标识,这说明我们的编辑器已经和 WSL Ubuntu 连接上了。
编写示例代码
在 VSCode 中依次创建 main.c
src/sum.h
src/sum.c
等文件,文件目录结构如下:
~/helloWorld/
├─ src/
│ ├─ sum.h
│ └─ sum.c
└─ main.c
main.c 文件:
#include <stdio.h>
#include "src/sum.h"
int main() {
int a = 1, b = 2;
int c = sum(a, b);
printf("%d + %d = %d\n", a, b, c);
return 0;
}
src/sum.h 文件:
int sum(int a, int b);
src/sum.c 文件:
int sum(int a, int b) {
return a + b;
}
Make 调试配置
我们先来看一下如何配置 Make 的调试,首先需要先在项目的根目录下创建 Makefile
文件,文件内容如下:
# 编译 main 可执行程序
main: main.o sum.o
$(CC) $(CFLAGS) main.o sum.o -o main
main.o: main.c
$(CC) $(CFLAGS) -c main.c -o main.o
sum.o: src/sum.h src/sum.c
$(CC) $(CFLAGS) -c ./src/sum.c -o sum.o
# 伪目标, 删除所有目标文件
clean:
rm *.o main
$()
是 Make 中读取变量的方式。
在 Make 中有一套内部变量可以在 make
命令中赋值,然后在 Makefile
中使用,如变量:AR
、CC
、CXX
、CFLAGS
、CXXFLAGS
等,具体可以参阅 GNU 官方文档:10.3 Variables Used by Implicit Rules。
CC
变量是 C 代码的编译器,默认值是cc
;CXX
变量是 C++ 代码的编译器,默认值是g++
;CFLAGS
变量可传递编译参数给 C 编译器;CXXFLAGS
变量可传递编译参数给 C++ 编译器;
接下来给 VSCode 设置编译和调试的各项配置。
.vscode/c_cpp_properties.json 文件
{
"version": 4,
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
]
}
.vscode/tasks.json 文件
{
// 更多任务设置参考:https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "Build For Debug",
"type": "cppbuild",
"command": "make",
"args": [
"CFLAGS=-g", // -g 参数会将调试信息编译到可执行程序中
"CXXFLAGS=-g"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": false
},
}
]
}
.vscode/launch.json 文件
{
// 更多调试设置参考:https://code.visualstudio.com/docs/cpp/launch-json-reference
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false,
"preLaunchTask": "Build For Debug",
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
},
"osx": {
"MIMode": "lldb"
},
"windows": {
"MIMode": "gdb",
"miDebuggerPath": "C:\\Softwares\\MinGW64\\bin\\gdb.exe"
}
}
]
}
配置好这些 json 文件后,在 main.c
中添加断点,然后点击菜单栏的 启动调试 F5
选项,程序运行并停在你打断点的地方。
CMake 调试配置
接下来我们把项目编译工具由 Make 改为使用 CMake。
首先把之前的 Makefile
文件删除,然后在项目根目录创建一个 CMakeLists.txt
文件,文件内容如下:
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.0)
# 配置项目名
project(helloWorld)
# 递归遍历获取项目的所有源文件列表
file(GLOB_RECURSE SRC_LIST FOLLOW_SYMLINKS main.c src/*.c)
# 生成可执行文件 main,后面是源码列表
add_executable(main ${SRC_LIST})
接者去修改 VSCode 的编译和调试配置。
.vscode/tasks.json 文件
{
// 更多任务设置参考:https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "Generate Debug",
"type": "cppbuild",
"command": "cmake",
"args": [
"-B",
"debug",
"-D",
"CMAKE_BUILD_TYPE=Debug",
"-G",
"\"MinGW Makefiles\""
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": false
},
},
{
"label": "Build For Debug",
"type": "cppbuild",
"command": "cmake",
"args": [
"--build",
"debug"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"dependsOn": [
"Generate Debug"
],
"group": {
"kind": "build",
"isDefault": true
},
}
]
}
.vscode/launch.json 文件
{
// 更多调试设置参考:https://code.visualstudio.com/docs/cpp/launch-json-reference
"version": "0.2.0",
"configurations": [
{
"name": "Project debug (C/C++ GDB)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/debug/main",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"externalConsole": false,
"preLaunchTask": "Build For Debug",
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
},
"osx": {
"MIMode": "lldb"
},
"windows": {
"MIMode": "gdb",
"miDebuggerPath": "C:\\Softwares\\MinGW64\\bin\\gdb.exe"
}
}
]
}
配置好这些 json 文件之后,点击菜单栏的 启动调试 F5
选项,程序运行并停在你之前打断点的地方。