引子
本文是征服VS Code系列的第二篇文章。会讲述2种在VS Code(以下我简称vsc)内实现C/C++多文件编译的方法。
什么样的人可以读这篇文章?
在继续往下看之前,请保证你已经懂得如何使用vsc进行单文件编译。如果觉得还不懂的,可以看征服VS Code的第一篇文章。在那里我会教你一些命令行编译基础。
同样的,这不是说明书,如果你喜欢顺着步骤无脑走下去那就······
废话少说,开始学习!
命令行
在Windows上有两种命令行:cmd
和Powershell
。你如果安装了Linux子系统,你也可以使用wsl
来构建Linux环境。
WSL = Windows Subsystem for Linux
我这里推荐使用Powershell
。其下脚本文件尾名是.ps1
。
使用脚本编译
这是很多地方基本上都不会提到的方法。思路就是写一个指挥编译的批处理文件,由这个文件指挥多文件编译。
在Windows上,我们可以用.bat
.ps1
这类脚本文件,把要输入的命令一行行写在里面,操作系统就会逐行执行下去。
注意:很多操作系统为了防止恶意脚本侵入会禁止执行命令行脚本。这种时候你就需要使用Administer权限来执行脚本。更多信息可以参考MSDN。
我新建了一个Demo的工程文件夹作为演示。其文件组织结构为:
Compile_Run.ps1
是我写的编译脚本,因为有了这个脚本,我们不再需要tasks.json
。现在我们要做的事情可以分为以下步骤:
- 打开
src
文件夹; - 把两个
.cpp
文件一起编译,生成的东西放到bin
里面; - 运行生成的文件;
- 回到
Demo
文件夹。
把上述语言翻译为命令,就得到了Compile_Run.ps1
的内容:
Set-Location ./src
# Compile
g++ Hello.cpp main.cpp -o ./../bin/Demo -O0 -g -Wall -std=c++17
# Run
Set-Location ./../bin
./Demo.exe
# Back
Set-Location ./..
解释如下:
命令 & 参数 | 解释 |
---|---|
Set-Location | 打开文件夹,cd命令是他的一个别名 |
g++ | 使用的C++编译器 |
-o | 给.exe文件命名,不写这个就默认为a.exe |
-g | 保留调试信息,没有这个就无法使用调试器 |
-O0 | 禁止优化,调试阶段最好这样做 |
-Wall | 警告等级开到最高 |
-std | C标准或者C++标准 |
以下是源文件和头文件的内容:
// main.cpp
#include "./../include/Hello.h"
int main(){
Hello h;
h.Say();
return 0;
}
// Hello.cpp
#include "./../include/Hello.h"
#include <iostream>
void Hello::Say(){
std::cout << "Hello World!" << std::endl;
}
// Hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
struct Hello
{
void Say();
};
#endif
提示:
#include
这个预处理命令只是把头文件内容复制粘贴到源文件中,所以我在文件名上就标注了路径帮助预处理器找到头文件。
安装一个Code Runner插件,你就可以直接按下CtrlAltN运行脚本了。
运行结果:
[Running] powershell -ExecutionPolicy ByPass -File "d:\pspro\C_C++_pro\Demo\Compile_Run.ps1"
Hello World!
[Done] exited with code=0 in 2.031 seconds
调试
调试需要的是launch.json
文件,戳一下左边那只甲虫,选择调试,会生成一个.vscode
文件夹,里面有我们熟悉的两个文件。其中的task.json
已经被我们的脚本替代,直接删掉就行。我们需要修改的是launch.json
里面的两行。
{
"version": "0.2.0",
"configurations": [
{
"name": "调试",
"type": "cppdbg",
"request": "launch",
// 修改下面这一行的路径为到生成exe文件的路径
"program": "${workspaceFolder}\\bin\\Demo.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\pspro\\mingw64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
// 这行注释掉,我们手动编译就行
// "preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
按下F5,你就可以开启调试了。注意编译的时候一定要加入-g参数。
结语:关于CMake
这样的脚本编译算是我一拍脑袋想出来的一个歪方法。更多人会建议你使用CMake来做多文件编译,但CMake并不是一下子就能看懂上手的,这个方法适合暂时还过渡不了同学实现多文件编译。
此外,使用CMake进行多文件编译我会写在本系列的第三篇文章,有心去等的不妨点个关注。有错误敬请在评论区指出。感谢您的观看。