返回

Ubuntu vscode 配置 c++ 开发环境(二): CMake

前言

在上一篇笔记: Ubuntu vscode 配置 c++ 开发环境(一),我整理了关于如何配置 vscode 来进行 c++ 程序的编译运行和调试。上一篇笔记中主要还是利用 g++ 来进行编译,这种方法一般只适用于很小型的项目(大部分只有一个源文件)。对于多文件项目一般采用 CMake 来进行依赖之间的配置。这篇笔记主要介绍一下如何配置 vscode 来利用 CMake进行多文件项目的编译和调试。

前提条件

  • 系统需要安装 cmake 以及gdb,可以通过以下命令安装
    • sudo apt install cmake gdb
  • vscode 需要安装以下插件:
    • C/C++:主要代码补全
    • CMake:主要是 CMakeLists.txt 的语言支持
    • CMake Tools:CMake 的主要配置插件

测试项目

为了测试插件,这里我简单创建了一个 CMake 项目,主要包括一个可执行文件的构建还有一个静态库,同时用到了外部库 opencv,文件目录结构如下:

DisplayImageFromText
├── 3rdparty-----------------------外部库
│   └── FileWriter-----------------外部库
│       ├── CMakeLists.txt
│       ├── include
│       │   └── FileWriter.hpp
│       └── src
│           └── FileWriter.cpp
├── CMakeLists.txt
├── data---------------------------数据
│   ├── images
│   │   └── lena.png
│   └── text
│       ├── input_file.txt
│       └── output_file.txt
├── include------------------------项目头文件
│   └── FileReader.hpp
└── src----------------------------项目源文件
    ├── FileReader.cpp
    └── main.cpp

程序的功能如下:

  • main.cpp 接收三个参数,分别作为输入文本文件路径,输出文本文件路径,数据图像文件夹
  • main.cpp 通过 FileReader 读取输入文本文件中的内容,按行存在字符串数组中,每一行代表一个图像文件名,(项目中的文件)
  • main.cpp 通过 FilerWriter 将上述内容写入输出文本文件中(项目中的第三方库)
  • main.cpp 调用 opencv 显示第一张图片(安装在系统中的第三方库)

vscode 配置

这里主要是利用微软官方的 CMake Tools 来进行配置,大部分操作都已经实现好了,比较简单,下面一一进行介绍

项目配置 — cmake ..

在 vscode 底部有一系列工具栏,分别可以调整编译器、编译模式、要编译的目标、调试按钮、运行等等,在使用 CMake Tools 之前一般会先让你选择好各项参数。

通过命令面板(Ctrl + Shift + p) 运行:CMake: Configure,插件会自动在根目录(CMakeLists.txt 所在路径)下生成 build 文件夹,并在其中运行 cmake .. 进行项目配置,如下所示:

项目编译 — make .

直接按底部工具栏中的 Build 或者通过命令面板运行: CMake: Build 或者 F7 都可以进行项目编译,还可以通过底部工具栏 Build 旁边选择要编译的目标,默认是 [all] 即编译所有目标,输出如下所示:

项目调试和运行

无参数的目标的调试和运行比较简单,首先可以通过 vscode 底下工具栏中的 Build 右侧的昆虫键和播放键来进行,如下所示:

如果需要有参数的情况,需要创建一个 launch 配置来进行,关于如何使用 launch 来进行项目可以参考我的上一篇笔记。这里我创建的 launch 配置如下:

{
    // 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) Debug DispalyImageFromText",
            "type": "cppdbg",
            "request": "launch",
            "program": "${command:cmake.launchTargetPath}",
            "args": [
                "${workspaceFolder}/data/text/input_file.txt",
                "${workspaceFolder}/data/text/output_file.txt",
                "${workspaceFolder}/data/images/"
            ],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [
                {
                    "name": "PATH",
                    "value": "$PATH:${command:cmake.launchTargetDirectory}"
                }
            ],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

其中需要留意的参数如下:

  • "name":针对这个调试配置的名称
  • "program":这里需要按照 CMake Tools 设为 ${command:cmake.launchTargetPath}
  • "args":调试输入的参数
  • "environment":这里也要按照 CMake Tools 进行相应设置

CMake Tools 目前不支持有参数的情况直接运行目标,所以我们还是采用 task 的方式来进行运行,我设置的 task 如下所示:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "Run Target: DisplayImageFromText",
            "command": "${workspaceFolder}/build/DisplayImageFromText",
            "args": [
                "${workspaceFolder}/data/text/input_file.txt",
                "${workspaceFolder}/data/text/output_file.txt",
                "${workspaceFolder}/data/images/"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "test",
            "presentation": {
                "reveal": "always"
              },
            "runOptions": { "reevaluateOnRerun": false }
        }
    ]
}

运行的方法和之前也差不多,这里就不赘述了。

结语

目前为止已经总结了如何利用 vscode 来进行小型以及大型 C++ 项目,之后可能还会总结以下针对 ROS 的相关配置。

Built with Hugo
Theme Stack designed by Jimmy