11# CMake 入门
22> [ !note]
3- > 学习这一篇的内容 ,需要你对以下技能有基本的了解:
3+ > 学习本文内容 ,需要你对以下技能有基本的了解:
44> * Make 入门(请参考[ 这篇文档] ( ./intro-make.md ) )
55>
66> 更重要的是,用过 Make 后,你更能体会到 CMake 带来的便利。
@@ -29,7 +29,7 @@ brew install cmake
2929
3030下面打开终端,键入:
3131
32- ``` plain
32+ ``` bash
3333$ cmake --version
3434cmake version 4.0.1
3535
@@ -115,17 +115,12 @@ cmake -B build -DCMAKE_BUILD_TYPE=Release
115115
116116CMake 通过一个名为 ` CMakeLists.txt ` 的文件定义构建规则。常见语法如下:
117117
118- ### 定义项目/约束CXX标准
118+ ### 定义项目
119119
120120``` cmake
121121# 规定 CMake 最低版本要求
122122cmake_minimum_required(VERSION 3.15)
123123
124- # 规定 C++ 最低标准
125- set(CMAKE_CXX_STANDARD 17)
126- set(CMAKE_CXX_STANDARD_REQUIRED ON)
127- set(CMAKE_CXX_EXTENSIONS OFF)
128-
129124# 定义项目
130125project(prj LANGUAGES C CXX)
131126```
@@ -170,8 +165,9 @@ CMake 提供了很多方便的命令管理 target 的属性,这里的 target
170165target_sources(myapp PUBLIC hello.cpp other.cpp) # 添加源文件
171166target_include_directories(myapp PUBLIC include) # 添加头文件搜索目录
172167target_link_libraries(myapp PUBLIC hellolib) # 添加链接库
173- target_add_definitions (myapp PUBLIC -DMY_MACRO =1) # 添加宏定义 MY_MACRO=1
168+ target_compile_definitions (myapp PUBLIC MY_MACRO =1) # 添加宏定义 MY_MACRO=1
174169target_compile_options(myapp PUBLIC -fopenmp) # 添加编译选项
170+ target_compile_features(mylib PUBLIC cxx_std_17) # 为指定目标启用编译器特性
175171```
176172
177173这些命令只对指定的 target 生效,而不会影响全局。
@@ -202,10 +198,9 @@ add_compile_options(-fopenmp) # 添加编译选项
202198cmake_minimum_required(VERSION 3.15)
203199project(prj)
204200
205- set(CMAKE_CXX_STANDARD 17)
206-
207201add_executable(prj main.cpp)
208202target_include_directories(prj PUBLIC include)
203+ target_compile_features(prj PUBLIC cxx_std_17)
209204```
210205
211206但是直接引入头文件,函数实现在头文件里,没有提前编译,每次需要重复编译同样的内容,编译时间长。
@@ -224,12 +219,11 @@ target_include_directories(prj PUBLIC include)
224219cmake_minimum_required(VERSION 3.15)
225220project(prj)
226221
227- set(CMAKE_CXX_STANDARD 17)
228-
229222add_subdirectory(fmt)
230223
231224add_executable(prj main.cpp)
232225target_link_libraries(prj fmt::fmt)
226+ target_compile_features(prj PUBLIC cxx_std_17)
233227```
234228
235229### 引用系统中安装的第三方库 ` find_package `
@@ -254,12 +248,11 @@ sudo apt install libfmt-dev
254248cmake_minimum_required(VERSION 3.15)
255249project(prj)
256250
257- set(CMAKE_CXX_STANDARD 17)
258-
259- find_package(fmt)
251+ find_package(fmt REQUIRED)
260252
261253add_executable(prj main.cpp)
262254target_link_libraries(prj fmt::fmt)
255+ target_compile_features(prj PUBLIC cxx_std_17)
263256```
264257
265258在CMake中,一个项目可以包含多个库。CMake允许一个包(package)提供多个库,这些库也被称为组件(components)。因此,在使用 ` target_link_libraries ` 指令链接库时,应采用 ` 包名::组件名 ` 的格式。
0 commit comments