Skip to content

Commit 1332573

Browse files
committed
new: vscode_and_cpp_env
1 parent c44655e commit 1332573

14 files changed

+251
-0
lines changed
124 KB
Loading
88 KB
Loading
11.8 KB
Loading
28.1 KB
Loading
18.7 KB
Loading
141 KB
Loading
47.3 KB
Loading
35.9 KB
Loading
14.2 KB
Loading
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
+++
2+
date = '2025-10-04T16:45:12+08:00'
3+
draft = false
4+
title = '搭建基于VSCode的跨平台C++学习环境'
5+
+++
6+
7+
## 前言
8+
9+
早期学习C/C++是非常痛苦的,不仅被老师要求下载20G的宇宙IDE VS,还得自己格式化代码,这就是我一开始对此不感冒的原因。
10+
11+
但是随着学的东西多了,不写代码也不行啊,我才渐渐发现有那么多强大的工具我不知道。
12+
13+
所以这里记录一下自己的折腾过程,希望能帮到初学C++的朋友们。
14+
15+
## 准备
16+
17+
由于我主要是在ArchLinux上面学习,偶尔会在Windows上面测试,这里大部分内容都会在Linux上面完成,不过别担心,这些工具都是跨平台的。
18+
19+
### Linux
20+
21+
很简单,直接安装这些软件包:
22+
23+
- **Clang** llvm的前端,包括了clangd既语言服务器
24+
- **GCC/LLVM** 编译器
25+
- **CMake** 依赖管理/构建系统
26+
- **Ninja** 构建器
27+
28+
### Windows
29+
30+
推荐用`scoop`一键解决,对于这些命令行工具可以说非常方便了。
31+
32+
需要安装的包:
33+
34+
- **llvm-mingw** 包含了clangd/clang了
35+
- **CMake**
36+
- **Ninja**
37+
38+
如果想`GCC`的话,可以到[WinLibs](https://winlibs.com/)下载:
39+
40+
41+
![winlibs](winlibs.webp)
42+
43+
一般来说下`UCRT`就行了,从`win10`之后都支持`UCRT`的。
44+
45+
---
46+
47+
安装VSCode不用多说了吧?
48+
49+
安装这些拓展:
50+
51+
- `CMake Tools`
52+
- `Clangd`
53+
- `CodeLLDB`
54+
55+
![extensions](extensions.webp)
56+
57+
### CMake拓展设置
58+
59+
按照如图显示的配置`CMake`生成的数据库文件,以便后续的`Clangd`查找。
60+
61+
![cmake_tools](cmake_tools.webp)
62+
63+
### Clangd拓展设置
64+
65+
填入`Clangd`寻找数据库的位置
66+
67+
![clangd](clangd.webp)
68+
69+
### CodeLLDB 拓展设置
70+
71+
安装完可能会下载一个调试包,对网络环境要求较高,如果遇到问题可以参考[这篇](https://zhuanlan.zhihu.com/p/566365173)文章。
72+
73+
## 创建项目
74+
75+
### 配置CMake
76+
77+
在你的项目根文件夹建立一个主`CMakeLists.txt`,内容可以这么写:
78+
79+
```cmake
80+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
81+
# 最低 CMake 版本要求
82+
cmake_minimum_required(VERSION 3.31)
83+
84+
# 项目名称和语言
85+
project(learnproj VERSION 1.0 LANGUAGES CXX)
86+
87+
# 设置 C++ 标准
88+
set(CMAKE_CXX_STANDARD 20)
89+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
90+
set(CMAKE_CXX_EXTENSIONS OFF)
91+
92+
93+
file(GLOB SUB_PROJECT_DIRS LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/src/*)
94+
95+
# 遍历所有找到的目录
96+
foreach(SUB_DIR ${SUB_PROJECT_DIRS})
97+
# 检查该目录下是否存在 CMakeLists.txt 文件
98+
if(IS_DIRECTORY ${SUB_DIR} AND EXISTS "${SUB_DIR}/CMakeLists.txt")
99+
# 将该目录名打印出来,方便调试
100+
get_filename_component(PROJECT_NAME ${SUB_DIR} NAME)
101+
message(STATUS "Found and added subproject: ${PROJECT_NAME}")
102+
103+
# 将这个文件夹作为一个子项目添加进来
104+
add_subdirectory(${SUB_DIR})
105+
endif()
106+
endforeach()
107+
108+
109+
## 根据需要按需添加
110+
111+
# # 查找 Qt 库
112+
# find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
113+
114+
# 添加可执行文件
115+
116+
# # 链接 Qt 库
117+
# target_link_libraries(MyQtProject PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets)
118+
119+
# # 自动处理 MOC、UIC 和 RCC
120+
# set_target_properties(MyQtProject PROPERTIES
121+
# AUTOMOC ON
122+
# AUTOUIC ON
123+
# AUTORCC ON
124+
# )
125+
```
126+
127+
你可以根据自己的需要,设置C++标准,扫描的文件夹,链接的库。这里就以`src`目录放置源文件,`include`放置头文件为例。
128+
129+
进入`src/current`创建一个子`CMakeLists.txt`,内容写上:
130+
131+
```cmake
132+
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
133+
134+
## 如果你需要添加别的源文件,别忘了在这里添加文件名,空白符为分隔。
135+
add_executable(${PROJECT_NAME} main.cpp
136+
)
137+
138+
if(MSVC)
139+
target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX)
140+
else()
141+
## 非MSVC指定一些警告参数
142+
target_compile_options(${PROJECT_NAME} PRIVATE
143+
-Wall
144+
-Wextra
145+
-Wpedantic
146+
# -Werror
147+
-Wconversion
148+
)
149+
endif()
150+
151+
## 这里指定的头文件的路径
152+
153+
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../include/${PROJECT_NAME})
154+
```
155+
156+
创建一个`main.cpp`,内容可以为空,你的项目应该这样:
157+
158+
![project_init](project_init.webp)
159+
160+
---
161+
162+
接着我们给`CMake`生成一些预设。
163+
164+
![quick_start](quick_start.webp)
165+
166+
快速入门-添加新预设-从编译器创建
167+
168+
![create_from_compiler](create_from_compiler.webp)
169+
170+
你如果只装了`Clang`,那么用不带`cl`的就行,同样也可以用`GCC`,看个人喜好。
171+
172+
输入名字,这里我是用`平台-编译器-构建器-版本`来命名的,回车会自动生成一个`CMakePresets.json`,像这样:
173+
174+
![preset](preset.webp)
175+
176+
因为我比较喜欢`Ninja`,所以加入这一行。如果你想用`Make`,那么记得手动安装。
177+
178+
然后在这里添加新生成预设,从配置预设中构建,名字可以是构建预设后面加上`-build`
179+
180+
![build_preset](build_preset.webp)
181+
182+
然后在这里选一下就好了:
183+
184+
![choose_build_preset](choose_build_preset.webp)
185+
186+
下面的生成目标可以选择你的文件夹名称了:
187+
188+
![choose_build_target](choose_build_target.webp)
189+
190+
打开你的`main.cpp`,看看`clangd`怎么样?原来已经成功加载数据库并运行了:
191+
192+
![clangd_log](clangd_log.webp)
193+
194+
随便写点东西,然后点击左下角的生成,启动,你的代码应该可以运行了。
195+
196+
![build_and_run](build_and_run.webp)
197+
198+
### 配置task
199+
200+
有人说,哎,我的<key>F5</key>一键调试呢?
201+
202+
`.vscode/`下创建一个`launch.json`,写上:
203+
204+
```json
205+
{
206+
"version": "0.2.0",
207+
"configurations": [
208+
209+
{
210+
"type": "lldb",
211+
"request": "launch",
212+
"name": "Debug",
213+
"program": "${command:cmake.launchTargetPath}",
214+
"args": [],
215+
"console": "integratedTerminal",
216+
"cwd": "${workspaceFolder}",
217+
},
218+
219+
]
220+
}
221+
```
222+
223+
大功告成!
224+
225+
## 后续
226+
227+
### 格式化
228+
229+
你可能对于`Clangd`的格式化不太满意,那么可以在项目根目录创建一个`.clang-format`的文件,里面写上你想要的风格,具体可以去搜一下。
230+
231+
这是我的:
232+
233+
```yaml
234+
# .clang-format
235+
# 使用 LLVM 风格作为基础,这是很常见的风格
236+
BasedOnStyle: LLVM
237+
# 强制缩进宽度为 4 个空格
238+
IndentWidth: 4
239+
# 强制指针和引用靠左
240+
PointerAlignment: Left
241+
# 强制使用空格进行缩进,而不是制表符
242+
UseTab: Never
243+
```
244+
245+
### 其他
246+
247+
如果想添加头文件,直接往`include/<你的项目名字>`放置即可。
248+
249+
如果觉得项目不错,想保留代码,直接把`current`文件夹复制一份,改个名,运行的时候到`CMake`里面切换配置/生成目标就好。
250+
251+
如果你想用`MSVC`,那么可以下`VS Installer`,里面只选构建工具,不过注意这样是没法生成`compile_commands.json`给`Clangd`读取的。

0 commit comments

Comments
 (0)