使用vscode一键调试docker中的cmake工程

文章介绍了如何在Ubuntu20.04环境下,利用VSCode、C++、CMake和Docker进行项目构建和调试的优化方法。通过编写和配置tasks.json及launch.json文件,实现了从终端命令到一键编译调试的自动化流程,包括使用nvidia-docker执行cmake、make以及运行程序。同时,文章提到了调试时将qDebug输出重定向到std::cout的方法,以及如何确保任务按顺序执行以优化构建过程。
摘要由CSDN通过智能技术生成


前言

提示:这里可以添加本文要记录的大概内容:

系统: ubuntu20.04
开发环境: cpp + vscode + cmake + docker


一、原来的操作

终端:
cd build
cmake ..
make -j14
#运行

调试基本上都是cout输出,然后编译运行,非常耗时不方便

二、使用vscode调试

1.编写task

标题栏->termianl(alt+T)->选择最后2项,进行修改,会生成.vscode文件夹(隐藏文件夹)和该文件夹下面的tasks.json,所有task相关的内容都由该文件配置
在这里插入图片描述

配置如下

1.cd build && cmake . .
{
   "label": "cmake in docker",
   "type": "shell",
   "command": " nvidia-docker exec -it -w /build/ develop cmake ..",
   "problemMatcher": []
}

解释:我使用的时nvidia-docker,这里根据你的配置来,后面的-it 和-w 可以查看docker --help,作用是将后面的 代码输入docker中的终端中。以上task完成了原来操作中的cd build 和cmake . .部分

2.make in docker
{
  "label": "make in docker",
  "type": "shell",
  "command": "nvidia-docker exec -it -w /build/ develop make -j15",
  "problemMatcher": "$gcc"
}

解释:同第一条类似,在docker终端执行make -j15

3. run in docker
{
   "label": "run in docker",
   "type": "shell",
   "command": "nvidia-docker exec -w /build -e LD_LIBRARY_PATH=/build/lib:/3rdparty/lib -e QT_PLUGIN_PATH=/3rdparty/plugins develop /build/bin/demo",
   "problemMatcher": []
}

解释:同上, 在docker终端中执行生成的可执行目标文件,-e 配置环境变量,具体可以查阅docker --help

4. all in one
{
    "label": "build in docker",
    "dependsOn": [
        //"x11 open",
        "cmake in docker",
        "make in docker"
    ]
}

解释:此步,组合了cmake和make,按序执行cmake . .和 make

5.x11 open&close
{
    "label": "x11 open",
    "type": "shell",
    "command": "xhost +local:docker > /dev/null  "
},
{
    "label": "x11 close",
    "type": "shell",
    "command": "xhost -local:docker > /dev/null  "
}

解释:如果希望将docker中生成的图形界面输出,组合使用x11 open,类似4

2.配置launch.json

如下图,打开.vscode下launch.json文件
在这里插入图片描述

"configurations": [
    {
        "name": "Launch C++ Docker Debug",
        "type": "cppdbg",
        "request": "launch",
        "program": "/build/bin/demo",
        "args": [],
        "stopAtEntry": false,
        "cwd": "/build",
        "environment": [
            {
                "name": "LICENSE_DIR",
                "value": "/Licenses"
            },
            {
                "name": "LD_LIBRARY_PATH",
                "value": "/build/lib:/3rdparty/lib"
            },
            {
                "name": "QT_PLUGIN_PATH",
                "value": "/3rdparty/plugins"
            }
        ],
        "sourceFileMap": {
            "/build": "/home/a/projects/cmake_projects/build"
        },
        "externalConsole": true,
        "filterStderr": true,
        "filterStdout": true,
        "preLaunchTask": "build in docker",
        "pipeTransport": {
            "pipeCwd": "",
            "pipeProgram": "nvidia-docker",
            "pipeArgs": [
                "exec",
                "-i",
                "-w",
                "/build",
                "--privileged",
                "rvs-develop",
                "sh",
                "-c"
            ],
            "debuggerPath": "/usr/bin/gdb"
        },
        "MIMode": "gdb",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ]
    }

解释:其中比较重要的是preLaunchTask,定义了编译的操作,在tasks.json中。
关于pipeTransport,由于我并未使用vscode的docker插件连接docker,如需编译,需要加上这一条。 如果你连接上了docker,可以进行修改


总结

配置launch.json启动你生成的软件,在preLaunchTask中调用tasks.json中的task编译生成。在文件中打上断点,即可做到一键(F5)先编译后调试cmake工程


已知不足

1. debug console只能输出std::cout, qDebug无法输出
2. 更新CMakeLists.txt后cmake . .的task可能报错,多按一次F5即可
3. 最后启动调试时,软件启动会比较慢


补充

1.debug

如何将qDebug()的信息输出至内置的debug中:
1.在工程的main.cpp中添加下列函数:

void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
  std::cout << msg.toLocal8Bit().data() << std::endl;
  if (type == QtFatalMsg) abort();
}

2.在main函数体中添加:

  qInstallMessageHandler(myMessageOutput);

注意添加头文件,这两步的目的主要是将qDebug的输出通道改为std::cout,qInfo等都适用

2.顺序执行(下面的更好)

因为配置文件中的task启动不依赖于上一步,所以cmake …和make是同时进行的,下面是修改后的task

        {
            "label": "cmake and make",
            "type": "shell",
            "command" : "docker exec -itw /build/ --env-file ~/projects/env.sh develop sh -c 'cmake -DCMAKE_BUILD_TYPE=Debug .. && make -j15'",
            "problemMatcher": "$gcc",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }

能保证每次先cmake … 成功后再执行make。 缺点是只修改一个文件时,编译比较慢

3.顺序执行

vscode tasks 项depends on 中有属性 dependsOrder, 如下,设为sequence,即为按序执行,默认为并行执行

        {
            "label": "build in docker",
            "dependsOrder": "sequence",
            "dependsOn": [
                "x11 open",
                "cmake in docker",
                "make in docker",
            ]
        },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值