Linux下使用VSCode开发C++使用配置

0.参考资料

VScode 配置 C++ 环境进行编译和调试

小兵VScode开发环境配置

本博客最终配置的两个工程模板代码: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是修改工作目录,这里把工作目录设置成 w o r k s p a c e F o l d e r − 当 前 工 作 目 录 ( 根 目 录 ) , 也 就 是 ‘ . v s c o d e ‘ 同 级 的 目 录 。 不 然 的 话 会 报 错 找 不 到 m a i n . c p p 文 件 , 因 为 默 认 的 {workspaceFolder} - 当前工作目录(根目录),也就是`.vscode`同级的目录。不然的话会报错找不到main.cpp文件,因为默认的 workspaceFolder().vscodemain.cpp{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"
        }
    ]
}

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值