在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可继续执行。

标签: Linux, Windows, WSL

已有 2 条评论

  1. wiki

    博主您好,按照您的教程,发现在vscode中打断点 F5调试时无法断到断点,直接执行完,这是为什么呢?

    1. ayahuasec

      要启用断点调试功能,您需要将launch.json中的stopAtEntry更改为true,可以修改后再尝试一下。

添加新评论