Ubuntu使用vscode写C++

visual studio code 本质上是个编辑器,并不是IDE,因此需要自己配编译器。不过vscode会推荐一些官方插件,还是比较方便的。

vscode 需要改写 .vscode/launch.json 和 .vscode/tasks.json,前者描述调试工程环境,如何启动任务,后者定义编译方法

工程示例

参考文章《在Linux中使用VS Code编译调试C++项目》
假定一个简单工程

/* solution.h */
 class Solution {
 public:
     void Say();
};

/* solution.cpp */
 #include <iostream>
 #include "solution.h"
 void Solution::Say(){
    std::cout << "HI!" << std::endl;
 }

 /* main.cpp */
#include "solution.h"
int main () {
     Solution sln;
     sln.Say();
     return 0;
 }

launch.json

用vscode打开一个工程文件夹,然后 查看->调试(ctrl+shift+d)选择编译环境
                
                     图1. 选择C++(GDB/LLDB)
选择好后会自动生成一个launch.json文件修改“program”和“prelaunchTask”即可

{
    // 使用 IntelliSense 了解相关属性
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0","configurations": [
        {
            "name": "(gdb) Launch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/hello",// 修改输出程序路径
            "args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true,"prelaunchTask": "build_hello",// 添加 "prelaunchTask" 编译任务
            "MIMode": "gdb","setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true
                }
            ]
        }
    ]
}

项目 说明
name 配置名称,会在启动配置的下拉菜单显示
type 配置类型,只能为cppdbg
request 请求类型,可以为launch或attach
program 将要调试的程序的路径
args 调试时传递给程序的命令行参数
stopAtEntry 设为true程序会暂停在入口处
cwd 调试程序时的工作目录
environment 环境变量
externalConsole 调试时是否显示控制台窗口
MIMode 指定连接的调试器,可以为gdb或lldb
prelaunchTask 调试开始前执行的任务,一般为编译程序

tasks.json

ctrl+shift+p 搜索选择 “配置任务”
       
                    图2. 选择“配置任务”
修改生成的 tasks.json为

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0","tasks": [
        {
            "label": "build_hello",// 与launch的"prelaunchTask"一致
            "type": "shell","command": "make",// 使用 makefile
            "problemmatcher": {
                "owner": "cpp","fileLocation": [
                    "relative","$workspaceRoot"
                ],"pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$","file": 1,"line": 2,"column": 3,"severity": 4,"message": 5
                }
            },"group": {
                "kind": "build","isDefault": true
            }
        }
    ]
}
  • “type” 可以选 shell 或 process
    如果是 shell ,那么 “command” 的内容会被解释成一条shell命令,否则会被理解为执行一个程序
  • 官方使用更为灵活的 shell + sh 的方式
    “type”=shell,”command”=”xx.sh”,在sh文件里实现复杂的编译方法
  • 这里我使用了 shell + make 的方式
    工程目录下再写一个标准的 makefile
/* makefile */
hello : main.o solution.o
    g++ -o hello main.o solution.o
main.o : main.cpp solution.h
    g++ -g -c main.cpp
solution.o : solution.h solution.cpp
    g++ -g -c solution.cpp
clean :
    rm main.o solution.o hello

编译和调试

  • 完成 tasks.json 后 ctrl+shift+b 编译
  • 代码插入断点,F5开始调试,F11单步(makefile 的输出和launch.json的“program”要一致

相关文章

目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、...
原文连接:https://www.cnblogs.com/yasmi/p/5192694.html ...
电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失...
参见:https://blog.csdn.net/weixin_38883338/article/deta...
Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netpla...
介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问...