在WSL中使用VSCode开发C语言项目
在Windows设备上开发Linux中使用的项目时,使用WSL可以在本地进行开发和编译工作,同时和实际的Linux环境保持较好的一致性。
假定已经安装好了VSCode,且配置安装好了WSL及至少一个发行版。此处以Debian为例。
在WSL中使用apt安装好编译C语言所需的相关软件包,其中build-essential可能包含后面的几个软件包,和其他一些编译所需的软件包,gcc用于编译c代码,g++用于编译cpp代码,gdb用于调试,make用于使用Makefile进行批量编译和处理等工作。
sudo apt-get install build-essential gcc g++ gdb make
在VSCode中安装"Remote - WSL"和"C/C++"两个插件,其中"C/C++"插件还需要安装到WSL环境中,在VSCode中根据提示操作即可。
如果在WSL中VSCode的安装路径的bin文件夹不在PATH变量中,则需要手动添加。此处以VSCode的默认安装路径C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\为例(注意修改Administrator为实际安装的用户名),使用
export PATH=$PATH:/mnt/c/Users/Administrator/AppData/Local/Programs/Microsoft\ VS\ Code/bin
将它暂时添加到PATH变量中,或者将
PATH=$PATH:/mnt/c/Users/Administrator/AppData/Local/Programs/Microsoft\ VS\ Code/bin
写入到WSL中的~/.bashrc文件的末尾,之后重新打开WSL窗口即可。
之后在WSL新建任意一个文件夹,运行
code .
即可在WSL的当前路径打开VSCode。
这里,我推荐的一个工程组织结构如下:
.
├── main
├── Makefile
├── obj
│ ├── *.o
│ └── main.o
└── src
│ ├── *.c
│ ├── *.h
│ └── main.c
└── .vscode
├── launch.json
└── tasks.json
其中,main文件是编译后产生的工程文件,在Makefile中修改即可,src文件夹放置所有的源代码文件,obj文件夹放置所有编译中产生的.o文件,.vscode文件夹是运行VSCode后会自动生成的配置文件,包含了这个工程编译、运行等操作的流程。
这里贴出我使用的Makefile文件的内容(注意,其中的8个空格在实际文本中需要替换为Tab):
OUT = main
CC = gcc
CFLAGS = -Wall -O2 -lm
CXX = g++
CXXFLAGS = -Wall -O2 -lm
ODIR = obj
SDIR = src
LIBS = -pthread -lm
INC = -Iinclude
C_SRCS := $(wildcard $(SDIR)/*.c)
CXX_SRCS := $(wildcard $(SDIR)/*.cpp)
C_OBJS := $(patsubst $(SDIR)/%.c,$(ODIR)/%.o,$(C_SRCS))
CXX_OBJS := $(patsubst $(SDIR)/%.cpp,$(ODIR)/%.o,$(CXX_SRCS))
OBJS := $(C_OBJS) $(CXX_OBJS)
$(ODIR)/%.o: $(SDIR)/%.c
$(CC) -c $(INC) $(CFLAGS) $< -o $@
$(ODIR)/%.o: $(SDIR)/%.cpp
$(CXX) -c $(INC) $(CXXFLAGS) $< -o $@
$(OUT): $(OBJS)
$(CXX) $(LIBS) $^ -o $(OUT)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o $(OUT)
这样通过make命令即可编译整个工程,并生成最终的可执行文件(这里是工程文件夹根目录中的main文件)。如果之前已经编译过,则make命令只会编译在上次编译之后修改过的文件,从而加快了后续编译的速度。通过make -j4命令使用4线程进行编译工作,从而加快编译速度。通过make clean命令在编译结束后删除编译中产生的.o文件,但是这样下次编译时会重新编译整个工程。
如果要在VSCode中通过按F5进行编译和调试,要对tasks.json和launch.json作出相应的修改。
修改后的tasks.json内容如下
{
"tasks": [
{
"type": "process",
"label": "C/C++: gcc build active file",
"command": "/usr/bin/make",
"args": [],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
即将原有的通过gcc或g++进行编译修改为通过make命令进行编译。这样后续增加文件时无需再修改配置文件。
修改后的launch.json内容如下:
{
// 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": "gcc - Build and debug active file",
"type": "cppdbg",
"request": "launch",
//"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"program": "${workspaceFolder}/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
即指定让VSCode使用工程文件夹下的main文件作为可执行文件,而不是每个.c文件编译后产生的可执行文件作为可执行文件,并指定gdb作为调试工具。这样,按F5可进行调试工作,在调试时进入断点暂停时再按F5可继续执行。
博主您好,按照您的教程,发现在vscode中打断点 F5调试时无法断到断点,直接执行完,这是为什么呢?
要启用断点调试功能,您需要将launch.json中的stopAtEntry更改为true,可以修改后再尝试一下。