vscode中如何使用Makefile在Linux下编译C/C++程序
前言
vscode号称宇宙最强IDE,由于是插件化,非常方便支持各类应用的开发,编程体验简直好到爆,在Linux中写C/C++程序的时候,如果源文件很少,vscode是可以直接调用clang/gcc/g++编译的,如果源文件较多,则相对比较麻烦一些,还是使用原始的makefile更方便管理,也更方便在github上做自动编译。
插件安装
C/C++插件
要开发C/C程序,首先要在vscode中安装c/c插件和C/C++ Extension Pack,如下图:
Makefile Creator插件
Makefile Creator插件可以自动生成Makefile的模板(非常熟悉Makefile的可以忽略这一步)
测试工程
新建源码
- 在vscode中,打开一个目录(这里我是在Windows中远程连接到一个Linux系统中,关于如何配置远程开发,以后有空再写文章)
- 新建一个源代码文件main.cpp,输入Hello world经典源码,如下:
#include iostream
using namespace std;
int main()
{
cout Hello world! endl;
return 0;
}
工程初始配置
此步骤对于已经熟悉vscode的tasks.json和Launch.json的配置,可以不用,不过这一步可以自动创建处配置文件的模板,即使熟悉了我也经常这样做。
直接按“F5”,此时,会提示选择配置,直接选择第一个即可,如下图:
选择后,会提供配置配置Launch,忽略掉后,程序不会直接运行,但会创建两个json文件。
- Launch.json是运行调试的配置文件,此时默认创建的应该是空文件,如下
{
version: 0.2.0,
configurations: []
}
- tasks.json是编译的配置文件,此时应该是默认使用了g++命令进行编译,如下:
{
tasks: [
{
type: cppbuild,
label: C/C++: g++ 生成活动文件,
command: /usr/bin/g++,
args: [
-fdiagnostics-color=always,
-g,
${file},
-o,
${fileDirname}/${fileBasenameNoExtension}
],
options: {
cwd: ${fileDirname}
},
problemMatcher: [
$gcc
],
group: {
kind: build,
isDefault: true
},
detail: 调试器生成的任务。
}
],
version: 2.0.0
}
默认编译和运行
直接按下“CTRL+ALT+B”快捷键,就会执行tasks.json中配置的默认build任务,生成可执行文件main,如下图:
在终端中执行./main,程序已经可以运行了,如下:
[ferris@cfnotes test]$ ll
total 24
-rwxrwxr-x 1 fawn fawn 19584 Sep 17 22:13 main
-rw-rw-r-- 1 fawn fawn 106 Sep 17 22:05 main.cpp
[ferris@cfnotes test]$ ./main
Hello world!
配置Launch.json和调试
菜单-运行-添加配置,此时会弹出配置模板选择,如下图:
选择第一个,会根据模板自动生成运行的配置文件,如下:
{
version: 0.2.0,
configurations: [
{
name: (gdb) 启动,
type: cppdbg,
request: launch,
program: 输入程序名称,例如 ${workspaceFolder}/a.out,
args: [],
stopAtEntry: false,
cwd: ${fileDirname},
environment: [],
externalConsole: false,
MIMode: gdb,
setupCommands: [
{
description: 为 gdb 启用整齐打印,
text: -enable-pretty-printing,
ignoreFailures: true
},
{
description: 将反汇编风格设置为 Intel,
text: -gdb-set disassembly-flavor intel,
ignoreFailures: true
}
]
}
]
}
将program修改为:${workspaceFolder}/main就进行调试了,打上断点后,按“F5”即可启动调试,如下图:
创建Makefile
安装了Makefile Creator插件,可以在左侧空白处点击右键,弹出菜单中有“Create Makefile”,如下图:
单击后,会提示输入Makefile的名称,不输入,默认可自动创建文件名为“Makefile”的文件。
创建后的Makefile文件内容如下:
CXX = g++
CXXFLAGS = -Wall -Werror -Wextra -pedantic -std=c++17 -g -fsanitize=address
LDFLAGS = -fsanitize=address
SRC =
OBJ = $(SRC:.cc=.o)
EXEC = main
all: $(EXEC)
$(EXEC): $(OBJ)
$(CXX) $(LDFLAGS) -o $@ $(OBJ) $(LBLIBS)
clean:
rm -rf $(OBJ) $(EXEC)
Makefile中OBJ = $(SRC:.cpp=.o) 是一个Makefile替换表达式,表示SRC目录库下的所有.cpp文件都有相应的.o文件,编译时会自动编译,这样就不用一个一个指定需要编译的文件了。
此时,直接在中断中执行make,就可以直接编译生成可执行的main文件了。
启用Makefile
虽然,Makefile已经创建成功了,但vscode中还没有启动,如果直接执行编译,是不会调用Makefile的。
我们只需要将前文所述生成的tasks.json文件稍作修改即可,修改后的文件如下:
{
tasks: [
{
type: cppbuild,
label: C/C++: g++ 生成活动文件,
command: make,
args: [
],
options: {
cwd: ${fileDirname}
},
problemMatcher: [
$gcc
],
group: {
kind: build,
isDefault: true
},
detail: 调试器生成的任务。
}
],
version: 2.0.0
}
以上json是将“command”修改未“make”,“args”都删除掉,将cwd修改为${workspaceFolder}。
此时,执行编译就可以直接试用makefile进行编译了。
Make前执行clean
有时候我们编译前想先执行以下clean,或者需要手动执行clean,修改tasks.json文件如下:
{
tasks: [
{
type: cppbuild,
label: C/C++: g++ 生成活动文件,
command: make,
args: [
],
options: {
cwd: ${workspaceFolder}
},
problemMatcher: [
$gcc
],
group: {
kind: build,
isDefault: true
},
detail: 调试器生成的任务。,
dependsOn:[make clean]
},
{
type: shell,
label: make clean,
command: make,
args: [
clean
],
options: {
cwd: ${workspaceFolder}
},
problemMatcher: [
$gcc
],
group: {
kind: none,
isDefault: false
},
}
],
version: 2.0.0
}
我们添加了一个make clean的task,执行命令make clean,此外在之前的编译task中增加了 “dependsOn”:[“make clean”] 字段的配置,此时,执行编译就会先执行make clean,再执行make。如果不需要先“make clean”,可以将dependsOn删掉即可。
更新于:6个月前相关文章
- 一个简单的大转盘抽奖程序(附.NetCore Demo源码)
- 【说站】python如何使用skimage包提取图像
- 【说站】php文件Hash如何使用
- 【说站】Python类属性如何使用
- 【说站】python中popitem如何使用
- 【说站】python中isnumeric如何使用
- 【说站】python casefold()方法如何使用
- 【说站】python轮盘赌算法如何使用
- 从程序媛角度去看项目管理
- 【说站】python中marshmallow库如何使用
- 【说站】python析构函数如何使用
- 【说站】python pyglet模块如何使用
- 【说站】python如何创建GUI程序
- 【说站】python字符串方法format()如何使用
- 【说站】css中fraction如何使用
- 【说站】js变量的作用域如何使用
- 【说站】python zip_longest如何使用
- 【说站】python阻塞调度如何使用
- 【说站】python if三元表达式如何使用
- 【说站】python事件循环如何使用?