.linux下使用cmake与preset构建cpp项目

1.main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int main()
{
auto lang = "C++";
std::cout << "Hello and welcome to " << lang << "!\n";

for (int i = 1; i <= 5; i++) {
std::cout << "i = " << i << std::endl;
}
return 0;

}

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake_minimum_required(VERSION 3.31)
project(preset1 VERSION 0.1 LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(SOURCE main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE})

set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/$<CONFIG>"
)

CMakePresets.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{
"version": 3,
"configurePresets": [
{
"name": "base-global",
"hidden": true,
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "YES"
}
},
{
"name": "base-ninja",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}"
},

{
"name": "base-linux-gcc",
"displayName": "GCC Base Configuration",
"description": "通用 GCC 配置基础层",
"hidden": true,
"inherits": ["base-global", "base-ninja"],
"cacheVariables": {
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++"
},
"vendor": {
"jetbrains.com/clion": { "toolchain": "Default" }
}
},

{
"name": "linux-debug",
"displayName": "Linux GCC Debug",
"inherits": ["base-linux-gcc"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "linux-release-static",
"displayName": "Linux GCC Release",
"inherits": ["base-linux-gcc"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_EXE_LINKER_FLAGS": "-static-libstdc++ -static-libgcc"
}
}
],
"buildPresets": [
{ "name": "debug", "configurePreset": "linux-debug" },
{ "name": "release", "configurePreset": "linux-release-static" }
]
}

编译命令

debug

1
2
cmake --preset linux-debug
cmake --build out/build/linux-debug

Release

1
2
3
4
5
cmake --preset linux-release-static
cmake --build out/build/linux-release-static

# 检查 Release 版本
ldd bin/Release/preset1