本文演示了在 MacOS 系统,使用 VS Code,clang 编译器,以及 cmake 编译配置工具来配置开发环境。

同时,本文的配置上传到了 这里 作为模版仓库。

更好的排版:


VS Code 搭建 c 编译、调试环境blog.vect0r.me

实现的功能:

  • [x] 代码高亮
  • [x] 自动补全
  • [x] 定义 / 引用跳转
  • [x] 一键编译 / 调试
  • [x] 断点

最终的项目目录树:



.
├── .editorconfig
├── .gitignore
├── .vscode
│   ├── c_cpp_properties.json
│   ├── launch.json
│   └── tasks.json
├── CMakeLists.txt
├── README.md
├── build
├── src
│   ├── CMakeLists.txt
│   ├── array.c
│   └── includes
│       ├── array.h
│       └── common.h
└── test
    ├── CMakeLists.txt
    └── array_test.c

5 directories, 13 files



安装扩展

  • C/C++: ms-vscode.cpptools
  • CMAKE: twxs.cmake

我知道有个叫做 CMake Tools 的扩展,但...体验并不好。

配置编译工具

首先请确认 clang、cmake、lldb 等已经安装,并添加到 PATH。

先来创建源代码文件夹和测试代码文件夹:



.
├── CMakeLists.txt
├── build
├── src
│   ├── CMakeLists.txt
│   ├── array.c
│   └── includes
│       ├── array.h
│       └── common.h
└── test
    ├── CMakeLists.txt
    └── array_test.c



一个 src 目录,来存放源代码文件;一个 test 目录来存放测试代码文件;以及一个 build 目录来存放编译之后的文件。然后在以上三个目录中分别创建一个 CMakeLists.txt 文件:来控制不同的代码的编译方式。

项目根目录 ./CMakeLists.txt:



cmake_minimum_required(VERSION 3.15)
project(vscode-c-project LANGUAGES C)

set(CMAKE_C_FLAGS "-g")

add_subdirectory(src)
add_subdirectory(test)



src 目录 ./CMakeLists.txt:

要记得给 clang 一个 -g 的 flag,来生成带有调试信息的编译文件。



include_directories(includes)

add_library(array SHARED array.c)



注明 include 头文件的位置,将 array.c 编译成共享链接库。

test 目录 ./CMakeLists.txt:



include_directories(../src/includes)

add_executable(array_test array_test.c)
target_link_libraries(array_test array)



同样注明 include 头文件的位置,编译可执行文件,然后链接 src 目录下生成的链接库。

配置编译器

执行 C/C++: Edit Configurations,生成 .vscode/c_cpp_properties.json 文件。这里定义了编译器的路径,还有搜索一些库文件的路径,以及编译的版本。因为头文件的位置并不和源文件在同一目录下,所以这里应该指明一下包含头文件的位置:



{
  "configurations": [
    {
      "name": "Mac",
      "includePath": ["${workspaceFolder}/src/includes"],
      "defines": [],
      "macFrameworkPath": ["/System/Library/Frameworks", "/Library/Frameworks"],
      "compilerPath": "/usr/bin/clang",
      "cStandard": "c11",
      "cppStandard": "c++17",
      "intelliSenseMode": "clang-x64"
    }
  ],
  "version": 4
}



配置任务

执行 Tasks: Configure Task,生成 .vscode/tasks.json 文件,然后配置两个任务:



{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "clean",
      "type": "shell",
      "command": "rm -rf build && mkdir build"
    },
    {
      "label": "build",
      "type": "shell",
      "command": "cd build && cmake .. && make",
      "dependsOn": "clean",
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}



一个 clean 任务用来清理编译之后的文件;一个 build 任务用来把代码都编译到 build 文件下。

同时将 build 任务设为了默认的编译任务,按 shift + command + b 可以直接一键编译。

到这里就完成编译的配置了,能成功编译之后再进行下一步。

配置调试

直接点击调试栏的齿轮,选择 C++ (GDB/LLDB),会自动生成 .vscode/launch.json 文件。简单修改一下 programpreLaunchTask 字段:



{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "clang build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/${relativeFileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "lldb",
      "preLaunchTask": "build"
    }
  ]
}



在每次调试前自动执行编译任务,并且调试 build 目录下编译之后的程序。

代码规范

如果有必要的话可以在添加 .editconfig 来控制代码风格,.gitignore 来在 git 检测代码更改时忽略编译之后的文件,README.md 来说明项目内容。

最终的效果图:




怎么让properties编译的时候替换掉里面的变量_mac c++ includepath


最终效果

直接按 F5 就会编译并调试当前打开的文件哦~