01
前言
有位朋友让我推荐一款Win10下好用的C语言编辑器,我毫不犹豫的选择了VSCode。免费、小而快、插件多这三点是我选择它的理由,本文就详解VsCode下编译、配置、调试C代码。(长文和多图预警!!可以收藏需要安装和配置时参考)
02
环境准备
编译器,VSCode只是个编辑器,C语言编译器要另外下载安装,笔者使用的MinGW64,安装好后一定不要忘记配置好环境变量,可以使用gcc -v确认编译器是否配置好。
VScode 官网下载安装。
03
编译运行
命令行编译运行
新建C文件,熟悉的HelloWorld。
这个时候可以使用命令行运行,VSCode菜单栏Terminal--->new Termial 如下进入目录直接运行。
一键运行
打开VSCode 安装下面俩个插件
安装好后选中c文件点击VSCode右上放的三角或者使用Ctrl+Alt+N即可运行。运行结果如下
多文件编译运行
上面讲述的都是单个文件的时候运行,从上面了解到其实Code Runner只是代替你手动输命令,当你需要少量的多文件运行,可以更改settings.json的gcc命令来实现。以如下目录结构为例,VSCode打开工作目录,
Ctrl+Shift+P 搜索settings 打开JSON文件
把settings.json 修改如下:
{
"files.autoGuessEncoding": true,
"code-runner.runInTerminal": true,
"files.associations": {},
"code-runner.executorMap": {
"c":"cd $dir && gcc *.c ../../hello2/src/*.c ../../hello1/src/*.c -I ../inc/ -I ../../hello2/inc/ -I ../../hello1/inc/ -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
},
}
其实就是按照gcc 源文件1.c 源文件2.c -I incPath1 -I incPath2的命令修改即可,注意头文件的路径可以是相对路径也可以是绝对路径,如果#include的时候把头文件的路径加上,gcc 编译的时候可以不用把路径加上。当程序文件很多架构大时,需要学习makefile的编写,使用make命令。还是以上面的文件为例。
Makefile文件
MainExt =.exe
SourceExt =.c
TargetExt =.o
OBJ_DIR := obj
BIN_DIR := bin
MAIN_SRC_DIR := main/src
MAIN_INC_DIR := main/inc
HELLO1_SRC_DIR := hello1/src
HELLO1_INC_DIR := hello1/inc
HELLO2_SRC_DIR := hello2/src
HELLO2_INC_DIR := hello2/inc
cc := gcc
CFLAGS := -g -Wall -I./$(MAIN_INC_DIR) -I./$(HELLO1_INC_DIR) -I./$(HELLO2_INC_DIR) -DDEBUG
MAIN_SRCS := $(wildcard $(MAIN_SRC_DIR)/*.c)
MAIN_HDRS := $(wildcard $(MAIN_INC_DIR)/*.h)
HELLO1_SRCS := $(wildcard $(HELLO1_SRC_DIR)/*.c)
HELLO1_HDRS := $(wildcard $(HELLO1_INC_DIR)/*.h)
HELLO2_SRCS := $(wildcard $(HELLO2_SRC_DIR)/*.c)
HELLO2_HDRS := $(wildcard $(HELLO2_INC_DIR)/*.h)
OBJS := $(patsubst $(MAIN_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(MAIN_SRCS))
OBJS += $(patsubst $(HELLO1_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(HELLO1_SRCS))
OBJS += $(patsubst $(HELLO2_SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(HELLO2_SRCS))
TARGET := $(BIN_DIR)/main$(MainExt)
.DEFAULT_GOAL := $(TARGET)
$(TARGET): $(OBJS)
$(cc) $(CFLAGS) -o $@ $^
$(OBJ_DIR)/%.o: $(MAIN_SRC_DIR)/%.c
$(cc) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/%.o: $(HELLO1_SRC_DIR)/%.c
$(cc) $(CFLAGS) -c -o $@ $<
$(OBJ_DIR)/%.o: $(HELLO2_SRC_DIR)/%.c
$(cc) $(CFLAGS) -c -o $@ $<
clean:
del .\$(BIN_DIR)\*.exe
del .\$(OBJ_DIR)\*.o
把settings.json 修改如下:
{
"files.autoGuessEncoding": true,
"code-runner.runInTerminal": true,
"files.associations": {},
"code-runner.executorMap": {
"c":"make && ./bin/main.exe",
},
}
运行结果
注意:win10下make命令要和编译器安装路径下的make可执行文件一致,我是把安装路径D:\Program Files\mingw64\bin\minGW64-make.exe修改为make.exe,不修改要使用minGW64-make命令
04
调试
我们经常要调试代码,下面来看看调试的配置。
打开工作目录(调试的话工作路径不能含有中文) 在工作目录下新建文件.vscode并创建tasks.json 和launch.json,可以手动创建也可以Ctrl+Shift+P 弹出的对话框中搜索后根据引导创建。
创建完成后根据自己的需求修改内容,下面给出单文件和多文件的一个示例。
单个文件调试
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": [
{
"preLaunchTask": "Build", //调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
"name": "(gdb) Launch", //配置文件的名字,可以随便起
"type": "cppdbg", //调试的类型,Vscode现在支持很多,我这里主要是C,所以只能是cppdbg
"request": "launch",//配置文件的请求类型,有launch和attach两种,具体看官方文档
"targetArchitecture": "x64", //硬件内核架构,为64bit,如图设置
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",//可执行文件的路径和文件名称
"args": ["file1", "file2"],//主函数调用时传入的参数
"stopAtEntry": true,//设为true时程序将暂停在程序入口处
"cwd": "${workspaceFolder}",//调试时的工作目录
"environment": [],
"internalConsoleOptions": "openOnSessionStart",//false
"externalConsole": false,//调试时是否显示控制台窗口
"MIMode": "gdb",//指定连接的调试器,可以省略不写
"miDebuggerPath": "D:/Program Files/mingw64/bin/gdb.exe",//安装minGW具体路径 更据自己安装的目录修改
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
tasks.json 配置内容如下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "gcc",
"args": [
"-g",
"-o",
"${fileBasenameNoExtension}",
"${fileBasenameNoExtension}.c",
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
配置完成后选择待调试的目标文件,按F5就可以调试代码。
多个文件调试
和上面配置CodeRuner的Settings.json一样当少量文件时我们可以简单的修改tasks.json中的gcc命令实现。以前文的目录结构为例修改后的tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "gcc",
"args": [
"-g",
"-o",
"${fileBasenameNoExtension}",
"main/src/${fileBasenameNoExtension}.c",
"hello1/src/*.c",
"hello2/src/*.c",
"-I",
"main/inc/",
"-I",
"hello1/inc/",
"-I",
"hello2/inc/",
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
当程序文件很多架构大时同样需要配合Makefile使用,仍使用前文的例子修改tasks.json中的command如下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "make",
}
]
}
注意:launch.json文件中
"${workspaceFolder}/${fileBasenameNoExtension}.exe",//可执行文件的路径和文件名称要和Makefile生成的.exe路径一样。
本文授权转载自公众号“嵌入式案例Show”,作者潜Sir
-END-
推荐阅读