文章目录
- 0.参考资料
- 1.环境配置
- 2.代码编译和调试配置
- 2.1.c_cpp_properties.json 编译环境相关的设置
- 2.task.json 编译参数设置
- 2.1.如果先配置了c_cpp_properties.json
- 2.2.如果还没有配置c_cpp_properties.json
- 2.3.launch.json 调试相关的参数
- 3.配合CMake使用的VScode配置
- 3.1.工程文件
- 3.2.配置tasks.json文件
- 3.3.配置launch.json文件
- 3.4.配置c_cpp_properties.json
- 3.5.settings.json文件
- 4.使用VSCode开发ROS
0.参考资料
本博客最终配置的两个工程模板代码:https://github.com/Cc19245/vscode_json_settings
1.环境配置
安装VScode后,安装C++、CMake、CMake Tools三个插件,这三个插件的作用如下:
- C/C++:代码智能提示、debug、代码导航
- CMake:CMake代码智能提示
- CMake Tools:这个插件是微软官方出品,作用应该是支持在VScode中使用CMake进行编译。而上面的CMake插件只是一个代码语言智能提示插件。
2.代码编译和调试配置
2.1.c_cpp_properties.json 编译环境相关的设置
该文件用于指定一般的编译环境,包括头文件路径,编译器的路径等。
通过 Ctrl + Shift + p 打开命令行,键入关键字 “C++”,在下拉菜单中选择 “C/C++ Edit configuration”,系统即自动在 .vscode 目录下创建 c_cpp_properties.json 文件,供用户进行编译方面的环境配置。默认的配置文件内容如下所示。
{
"configurations": [
{
"name": "Linux", //环境名
"includePath": [
"${workspaceFolder}/**" //指定头文件路径,这里指定的是当前工作目录,如有需要在后面添加,添加方式是加入 "/to/path" 格式的路径
],
"defines": [],
"compilerPath": "/usr/bin/g++", //编译器的路径,可根据自己的安装情况进行设置
"cStandard": "c11",
"cppStandard": "c++17", //设置使用的 C/C++ 标准
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
注意:
- 这里说的是关于编译环境的配置,其中包括了头文件路径。这个头文件路径的设置我觉得在使用g++进行编译的时候可能比较有作用,因为如果使用g++编译,也就是后面要讲的
tasks.json
文件中的command
使用g++,这样包含头文件路径在这里设置就起作用了; - 但是当配合CMake使用的时候,由于
CMakeLists.txt
文件中有命令会设置编译的时候寻找的头文件路径,所以这里的头文件路径可能就不会发挥作用了。此时这个文件一个很重要的作用可能是制定编译器的路径,也就是"compilerPath": "/usr/bin/g++"
。 - 另外这里制定头文件路径的作用应该还有一个,就是可以用于代码的智能提示补全。有的时候不在这个文件中设置头文件路径的话,无法进行代码补全,主要是包含一些库文件的时候,比如使用ros。
2.task.json 编译参数设置
2.1.如果先配置了c_cpp_properties.json
该文件用于指定程序的编译规则,即如何将源文件编译为可执行程序。通过Ctrl + Shift + p
打开命令行,键入关键字task
,并在下拉菜单中选择 Tasks: Configure Default Build Task
-> Create task.json file from template -> Others
,系统即自动在 .vscode
目录下创建 task.json
文件( 基础模版 ),供用户设置具体的编译规则,此时默认生成的task.json
文件内容如下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo Hello"
}
]
}
注意此时仅生成了一个task.json
的简化模板。再打开命令行,选择 Tasks:Configure Default Build Task
选项,此时名字是echo
的一个task会出现在选项栏中,此时点击这个task的名字,则对应的 task.json
文件会发生改变,变成如下的内容。对比上面默认的task就会发现,这里的task.json
的改变就是把echo
这个task加入了build
分组,并且设置它为默认的task( 即执行命令 Tasks: Run Build Tasks
时默认执行的是该 task.json
文件对应的编译 )。
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo Hello",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true // 这里被设置成默认的task
}
}
]
}
2.2.如果还没有配置c_cpp_properties.json
通过 Ctrl + Shift + p
打开命令行,键入关键字 task
,并在下拉菜单中选择Tasks: Configure Task
-> C/C++:g++生成活动文件
,系统即自动在 .vscode
目录下创建task.json
文件,这个时候生成的不是上面无意义的文件了,而是实际真正可以用g++来编译代码的文件,此时生成的task.json文件内容如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: /usr/bin/g++"
}
]
}
同理,下面设置这个task.json
为默认的task。再打开命令行,选择 Tasks:Configure Default Build Task
选项,此时名字是C/C++: g++ 生成活动文件
的一个task会出现在选项栏中,此时点击这个task的名字,则对应的 task.json
文件会发生改变,变成如下的内容。对比上面默认的task就会发现,这里的task.json
的改变就是把C/C++: g++ 生成活动文件
这个task加入了build
分组,并且设置它为默认的task( 即执行命令 Tasks: Run Build Tasks
时默认执行的是该 task.json
文件对应的编译 )。
此外,为了生成可执行文件,需要手动修改一些地方:
- “args”:command的参数,修改成可执行文件和源文件名称;
- “options”:在执行command之前的操作,这里cwd是修改工作目录,这里把工作目录设置成{fileDirname} - 当前打开文件的目录。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-g",
"-o", // 另外注意这里-o选项的顺序在前面,-o后面一定要紧连着可执行文件的名字,而原来的顺序就是错误的
// "${file}",
"hello", // 这里手动修改成了想生成的可执行文件的名字
// "${fileDirname}/${fileBasenameNoExtension}"
"main.cpp" // 这里手动修改成了要编译的源文件的名字
],
"options": {
// "cwd": "${fileDirname}"
"cwd": "${workspaceFolder}" // 这里要修改成根目录,这样才能找到文件
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: /usr/bin/g++"
}
]
}
2.3.launch.json 调试相关的参数
该文件主要与程序的调试相关。用户可通过 Ctrl+Shift+p 打开命令行,键入关键字 launch
,选择 Debug:Open launch.json
-> C++(GDB/LLDB)
,即可打开调试的配置文件 launch.json
。 注意:这个方式我没找到,搜索launch
搜不出来,所以使用下面的方法:
此时会自动进入调试模式,也自动生成了launch.json
文件,但是由于生成的launch.json
配置不正确,所以调试不会成功,不用管,这一步就是为了生成launch.json
文件。
该文件设置 VScode 在调试时的基本内容和要求。在配置好 launch.json
文件后, 按 F5 即可进入调试模式。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": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
// "program": "${fileDirname}/${fileBasenameNoExtension}",
"program": "${workspaceFolder}/hello", // 只需要这里修改成要调试的可执行文件名称即可
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件", // 这里的预先任务就是在调试之前执行的编译任务,名称要和task.json文件中的label一样
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
在launch.json
文件配置好后,用户通过 F5 即可进入调试模式。注意,只有生成可执行程序时加入了编译选项 -g ( 如本例中,build.json 文件中的 args 部分包括 -g 选项 ),上述可执行文件才可以通过 gdb 进行调试。
3.配合CMake使用的VScode配置
3.1.工程文件
工程目录如下:
- main.cpp
#include <iostream>
#include "swap.h"
int main(int argc, char **argv)
{
std::cout << "hello world" << std::endl;
int a = 10, b = 20;
std::cout << "a = " << a << ", b = " << b << std::endl;
my_swap(a, b);
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}
- swap.cpp
#include "swap.h"
void my_swap(int &a, int &b)
{
int temp = b;
b = a;
a = temp;
}
- swap.h
#pragma once
void my_swap(int &a, int &b);
- CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test_swap)
include_directories(include)
set(CMAKE_BUILD_TYPE Debug) # 如果想使用gdb调试功能,这里必须手动设置成Debug模式
add_executable(test_swap main.cpp src/swap.cpp)
3.2.配置tasks.json文件
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build" // 执行下面的命令之前先执行的命令,切换工作目录
},
"tasks": [
{
"type": "shell", // 该task是命令行的输入
"label": "cmake", // 该task的名称
"command": "cmake", // 实际真正输入的命令
"args": [
".."
]
},
{
"type": "shell", // 该task是命令行的输入
"label": "make", // 该task的名称
"command": "make", // 实际真正输入的命令
},
{
"label": "Build", // 该task的名称,如果进行调试的话,launch.json中的preLaunchTask名字要和这个一样
"dependsOrder": "sequence", // 该task是一个总的task,依赖下面的task,并且下面的task是按照顺序来执行
"dependsOn":[
"cmake", // 执行顺序:先执行cmake .., 再执行make
"make"
],
"group": { // 这个命令属于build组,并且是默认命令,即快捷键ctrl+shift+B执行
"kind": "build",
"isDefault": true
}
},
]
}
此时按照这个配置完成之后,直接ctrl+shift+B
就可以运行这个编译任务了,如果程序编写没有错误就能在build文件夹下看到可执行文件。
3.3.配置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": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/test_swap", // 要调试的可执行文件名称,要和CMakeLists.txt中的可执行文件名称对应
"args": [], // 要调试的可执行文件传入的参数,也就是argv
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "Build", // 这里的预先任务就是在调试之前执行的编译任务,名称要和task.json文件中的label一样
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
3.4.配置c_cpp_properties.json
其实这里配不配置这个文件应该影响不大了,使用了CMake编译之后这个文件对于编译已经不起作用了。但是这个文件中的头文件路径设置可能和代码智能提示有关,所以还是需要进行配置一下。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**" // 如果代码智能提示不出现,尝试这里手动包含一下使用的库的头文件路径
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
3.5.settings.json文件
这里面应该是对一些vscode的插件的配置,好像还有文件名称的设置,比如.cc文件关联到.cpp文件上。具体好像不用特别在意。
4.使用VSCode开发ROS
参考资料:http://www.autolabor.com.cn/book/ROSTutorials/chapter1/14-ros-ji-cheng-kai-fa-huan-jing-da-jian/142-an-zhuang-vscode.html
按照这个步骤来就可以,其中教程中最后一步配置task.json
实际上和上面是一样的,内容如下:
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}