Bootstrap

C++拾趣——使用VSCode跨平台调试CMake编译的C/C++项目

VSCode的远程开发功能为开发者带来了诸多好处,极大地提升了开发效率和灵活性。首先,它允许开发者在本地编辑环境中直接连接到远程服务器或容器进行代码开发,这样就不需要在本地机器上搭建完整的开发环境,节省了大量的时间和精力。无论是使用SSH连接到远程Linux服务器,还是在Docker容器中进行开发,VSCode都提供了无缝的集成和便捷的操作体验。

远程开发的好处不仅在于节省时间,还在于它提供了跨平台的支持。开发者可以在任何操作系统上使用VSCode,并通过远程开发功能连接到远程服务器,这消除了对特定平台的依赖,使得开发环境更加灵活和多样化。同时,VSCode丰富的插件生态系统也为远程开发提供了强大的支持,无论是代码编辑、调试、版本控制还是其他开发工具,都可以通过安装相应的插件来实现。

远程连接

如果远程机器是WSL,可以参考《Windows Subsystem for Linux——vscode远程开发》这篇文章;如果是某些通过IP访问的机器,只要配置User/.ssh/config文件
在这里插入图片描述
在里面添加如下字段即可。
在这里插入图片描述
然后通过Connnect to Host,选择对应的机器,便可以登录进去。
在这里插入图片描述

编译

我们以调试《C++拾趣——编译器预处理宏__COUNTER__的应用场景》中的项目为例。它的路径位于https://github.com/f304646673/cpulsplus/tree/master/counter。其目录结构如下:

在这里插入图片描述
最外层的CMakeLists.txt定义了项目的根目录以及头文件路径,然后通过add_subdirectory处理子目录中的CMakeLists.txt。

cmake_minimum_required(VERSION 3.12)
project(counter)

# Set the root directory to the current directory
set(ROOT_DIR ${CMAKE_SOURCE_DIR})

include_directories(${CMAKE_SOURCE_DIR})

# 自定义函数:遍历所有子目录并添加包含CMakeLists.txt的子目录
function(add_all_subdirectories)
    file(GLOB_RECURSE SUBDIRS RELATIVE ${CMAKE_SOURCE_DIR} */CMakeLists.txt)
    foreach(SUBDIR ${SUBDIRS})
        get_filename_component(DIR ${SUBDIR} DIRECTORY)
        add_subdirectory(${DIR})
    endforeach()
endfunction()

# 调用自定义函数
add_all_subdirectories()

子目录的CMakeLists.txt如下。它会按最后一层目录生成一个可执行文件名,然后编译这个目录下的代码,最后链接相关库,生成可执行文件。

# Collect all source files in this directory
file(GLOB SOURCES "*.cpp")

# 获取当前文件所在目录名
get_filename_component(CURRENT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME)

# 将目录名首字母大写
string(SUBSTRING ${CURRENT_DIR} 0 1 FIRST_CHAR)
string(TOUPPER ${FIRST_CHAR} FIRST_CHAR_UPPER)
string(SUBSTRING ${CURRENT_DIR} 1 -1 REMAINING_CHARS)
set(CAPITALIZED_DIR_NAME "${FIRST_CHAR_UPPER}${REMAINING_CHARS}")

# 拼接成add_executable的第一个参数
set(EXECUTABLE_NAME "${CAPITALIZED_DIR_NAME}Executable")

# Add the executable target
add_executable(${EXECUTABLE_NAME} ${SOURCES})

调试

为了让这个项目可以在VSCode中可以被调试,需要做如下准备工作。

安装插件/组件

VSCode插件

在VSCode的插件页面,我们在远程开发环境中安装CMake Tools和C/C++。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调试组件

然后在远程环境(Linux)中安装必须的调试组件

sudo apt-get update
sudo apt-get install build-essential gdb

配置CMakePresets.json

CMakePresets.json 是一个用于配置 CMake 构建系统的 JSON 文件。它定义了不同的构建预设(presets),每个预设包含特定的构建配置和环境设置。以下是文件的主要部分和作用:

  • name: 预设的名称,用于在构建时选择特定的配置。
  • hidden: 一个布尔值,指示该预设是否在用户界面中隐藏。
  • description: 对预设的简短描述。
  • generator: 指定使用的构建系统生成器,例如 “Unix Makefiles”。
  • binaryDir: 指定构建输出的目录。
  • cacheVariables: 定义 CMake 缓存变量,例如 CMAKE_BUILD_TYPE。
  • environment: 设置构建时的环境变量,例如 CC 和 CXX。

内容如下:

{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 10,
        "patch": 0
    },
    "configurePresets": [
        {
            "name": "Debug",
            "hidden": false,
            "description": "Debug build",
            "generator": "Unix Makefiles",
            "binaryDir": "${sourceDir}/build/log",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_EXPORT_COMPILE_COMMANDS": "YES"
            },
            "environment": {
                "CC": "gcc",
                "CXX": "g++"
            }
        },
        {
            "name": "Release",
            "hidden": false,
            "description": "Release build",
            "generator": "Unix Makefiles",
            "binaryDir": "${sourceDir}/build/log",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Release"
            },
            "environment": {
                "CC": "gcc",
                "CXX": "g++"
            }
        }
    ]
}

配置CMake Tools

在侧边栏我们打开CMake Tools
在这里插入图片描述
点击Configuration下的按钮,选择Debug
在这里插入图片描述
可以发现相关项目进行了编译链接。
在这里插入图片描述

调试

我们打开macro/main.cpp文件,然后在第7行下断点。
在这里插入图片描述
然后在侧边栏CMake Tools的PROJECT OUTLINE下找打上述文件对应的可执行文件,右键之,选择Debug。
在这里插入图片描述
如此我们就看到项目调试成功了。
在这里插入图片描述

参考资料

;