首先要明白,vscode只是一个记事本,本身是不能够进行任何程序语言开发的。只不过这个记事本可以安装C++插件,使得它可以进行开发。
windows 10上使用vscode编译运行和调试C/C++ - 知乎
一、Vscode下C++的项目结构
首先,类似于我们在IDEA中新建一个普通java项目,项目的目录结构是这样的:
新建一个maven模板的java项目,项目的目录结构是这样的:
构建一个web模板的java项目,项目的目录结构是这样的:
用springboot模板构建一个java项目,项目的目录结构是这样的:
对于C++来说,成熟的包管理工具(例如java的maven,Python的anaconda)和框架(有一个QT比较成熟)都比较有限,所以一个C++项目没有上面那么多模板。
在微软的vs中,创建一个C++的控制台程序,模板的目录结构是这样的:
用Vscode构建一个C++项目,其目录结构一般要写成这样:
> .vscode
> build
> include
> src
> bin
> lib
下面我们挨个讲这6个文件夹。
二、各个文件夹的作用
2.1 .vscode
.vscode文件夹一般应该包含三个配置文件:c_cpp_properties.json、tasks.json、launch.json。其中和CMakeList相关的是前两个文件:c_cpp_properties.json、tasks.json。
1. c_cpp_properties.json
c_cpp_properties.json是用于配置编译器环境的,这里最重要的就是includePath,其指明了C/C++标准库、用户头文件所在位置。如果我们使用的库不在includePath里面,我们需要手动添加。这样的话不需要CmakeLists.txt文件也可以编写C/C++。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/**",
"/usr/local/**",
"/usr/lib/**"
],//头文件路径
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
2.tasks.json
tasks.json主要作用是添加构建(编译、链接等)任务。也就是说,我们除了单纯编辑源码外,要想编译、链接生成可执行文件,必须要配置这个文件。当然了,CMakeLists.txt可以替代这个文件。
创建tasks.json的文件的方法如下:
首先,按住ctrl+shift+p打开命令行,如下图所示
在输入框输入:
Tasks: Run task
出现如下提示:
回车,然后出现:
继续回车:
选择最下面Others选项,会生成默认的task.json。
以下是我们常用到的task.json文件。label一般我们都设置为build,command即选择什么编译器进行编译,一般选gcc或g++,args为编译的时候用到的参数,具体可参见https://blog.csdn.net/yfldyxl/article/details/81389543
{
// 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": "g++",
"args":["-g", "${file}", "-std=c++11", "-o", "${fileBasenameNoExtension}.out"]
}
]
}
3.launch.json
launch.json主要是调试时的配置文件,也就是说如果我们单纯只是想生成可执行文件,其实这个文件没有也可以。
创建launch.json的文件的方法如下:
点击左侧下面第4个类似于一个虫子的图标,即DEBUG
然后点击蓝色的字体create a launch.json file:
选择第一个C++(GDB/LLDB)即可生成一个默认的launch.json文件。
以下是我们常用到的launch.json文件。这里面有两个参数比较重要,一个是program参数,其为生成的可执行文件名,一定要与tasks.json文件中指定生成的文件名相同。还有一个是preLaunchTask,一般也要与tasks.json文件中的label一致,一般都是build。
{
// 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": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
2.2 build文件夹
类似于java项目的target文件夹,主要用来存放生成的Makefile以及可执行文件。
2.3 include文件夹
主要用来存放我们自己编写的头文件
2.4 src文件夹
存放我们自己写的c/cpp文件
2.5 bin文件夹
存放动态链接库
2.6 lib文件夹
存放静态链接库
三、编码+编译+运行+调试 一体化
这样构建工程以后,编辑源码、编译运行、调试(!!!)都可以在vscode中进行。
其实对于一个庞大的C++工程,我们可以不必写上面的.vscode文件夹,因此也就不必写那3个json文件。原因在于一个庞大的C++工程如果配置tasks.json然后用gcc或g++来编译,太过麻烦,他们更适合单一的文件编译,而通常C++工程通常较为庞大,因此更推荐编写CMakeLists.txt。实际的项目中,用的也都是CMakeLists。