本文演示了在 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
文件。简单修改一下 program
和 preLaunchTask
字段:
{
"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
来说明项目内容。
最终的效果图:
最终效果
直接按 F5
就会编译并调试当前打开的文件哦~