前言
vscode是个非常优秀的跨平台编辑器,尤其在Linux上更为常用。在vscode上进行c++语言的编译、运行和调试已经有了很多教程,但是使用vscode进行多文件的c++编译、调试的教程却相对难找。以下整理出一个在VScode上搭建C++/C开发环境的全过程。
原理
在Linux上进行c++的多文件编译,主要依靠的是GNU的Makefile,使用make命令进行编译。而makefile的可读性差、语法复杂、跨平台性差等问题又催生了可以在多平台运行、语法简洁的CMake,用来自动生成Makefile。
CMake是一个语法简单的跨平台编译工具。只要编写CMakeLists.txt文件,然后使用cmake命令,就可以根据不同的平台生成合适的Makefile文件,再利用make命令即可编译文件。
问题是,Makefile是Linux的编译工具,怎么在Windows平台上使用呢?毫无疑问可以使用WSL,在Linux子系统中进行c++项目开发。
但是在Windows上使用Makefile也不是没有可能,只要安装GNU在Windows上的移植版——mingw就行了。MinGW中的mingw64-make即为Linux中的make。
实操
前置工作
没下载MinGW就去下一个。用处很多。
然后下载CMake。
Linux: sudo apt-get install make
Windows: 上官网下最新版。
配置CMakeLists.txt
首先将文件夹设置为项目名称。
然后在项目文件夹下添加CMakeLists.txt:
1 | # CMakeLists.txt |
从上面的配置中可以分析出:源文件应该写在./src
文件夹下,而头文件应该写在./include
文件夹下。也可以改成其他目录。
代码什么意思在注释中写得很明白了,想要实现更多功能,可以上网查找CMake教程。
tasks.json配置–CMake构建,Makefile编译
在/.vscode下添加tasks.json:
1 | { |
这里面定义了一大堆Task,有的是编译并运行,有的是仅编译,有的是仅调用cmake,有的是调用CMake和make,使用时按下Ctrl + Shift + B
选择合适的task, 看下中文解释就行。
唯一需要解释的一个Task就是MkBuild。MkBuild实际上就是执行mkdir -p build
。会创建一个叫做build的文件夹。项目的中间文件和最后的可执行文件都会生成在这个文件夹里。后面调试时的文件路径也依赖于build文件夹。
推荐使用CMake and Make进行编译,使用Run进行运行。可以设置task的快捷键,参考网上资料。
注意:按照CMake在原理中的描述,它仅仅是作为生成Makefile文件的工具使用,但是如果运行cmake . --build
,CMake就可以不依赖Makefile,自己寻找合适的编译器进行编译。Tasks中的Compile就是这样。此时CMake会根据平台自动选择合适的编译器。在Linux的平台上,CMake会选择g++, make等工具。而在Windows平台上, CMake大概率是不知道你安装了MinGW的,它会选择微软著名的编译器Visual Studio进行编译,还会顺带生成一个Visual Studio解决方案方便你调试。不过我既然都生成Visual Studio的C++工程了,直接用Visual Studio开发不是更香吗(笑)。
至此已经可以进行编译。
launch.json配置–gdb断点调试项目
新建launch.json:
1 | { |
默认调试按键是F5
。打上断点,按下F5
,系统自动运行CMake and Make编译程序。会有点慢。
注意:在CMakeLists.txt中有三句话:
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
分别是:项目构建方式设置为调试模式(如果是Release则是发布模式)、调试时使用gdb、发布时使用3级优化(有0~3级)。
至此可以进行调试。
tasks.json内容解释
待更新。
更进一步
手动配置文件虽然自由度高,但是还是挺麻烦。VSCode给我自动推荐了一个CMake插件叫做CMake Tools,好像也挺好用的,不知道后续能不能用插件一键生成多文件项目。
Tasks中的功能有点多了。之后尝试简化,方便使用。
gdb调试有个问题,就是长时间挂在一边不动,或者在监视窗口贸然输入一个变量进行监视时就有可能突然停止调试,错误信息闪了一下就消失了。稳定性还不行,原因未知。
这些配置还没有在Linux平台上尝试,可能需要进一步的测试和完善。