|
|
|
@ -257,14 +257,102 @@ target_include_directories(MyApp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # 将生
|
|
|
|
|
|
|
|
|
|
执行 `cmake -S . -B build` 命令后我们可以在 build 目录下看到生成 的config.h 文件,其中包含我们设置的版本号、编译时间和编译目录等信息。
|
|
|
|
|
|
|
|
|
|
### 设置支持的 C++标准
|
|
|
|
|
### 设置支持的 C 标准
|
|
|
|
|
|
|
|
|
|
CMake 支持以下 C 标准版本:
|
|
|
|
|
|
|
|
|
|
- `90` 或 `c_std_90`:C89/C90 标准
|
|
|
|
|
|
|
|
|
|
- `99` 或 `c_std_99`:C99 标准
|
|
|
|
|
|
|
|
|
|
- `11` 或 `c_std_11`:C11 标准
|
|
|
|
|
|
|
|
|
|
- `17` 或 `c_std_17`:C17 标准
|
|
|
|
|
|
|
|
|
|
- `23` 或 `c_std_23`:C23 标准(如果 CMake 和编译器支持)
|
|
|
|
|
|
|
|
|
|
#### 设置全局 C 标准
|
|
|
|
|
|
|
|
|
|
我们可以使用 `set(CMAKE_C_STANDARD <version>)` 设置全局 C 标准。例如:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
cmake_minimum_required(VERSION 3.10)
|
|
|
|
|
project(MyProject)
|
|
|
|
|
|
|
|
|
|
# 设置 C 标准为 C11
|
|
|
|
|
set(CMAKE_C_STANDARD 11)
|
|
|
|
|
|
|
|
|
|
# 强制使用指定标准,禁止回退
|
|
|
|
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
|
|
|
|
|
|
|
|
# 禁用编译器扩展(如 GNU 扩展)
|
|
|
|
|
set(CMAKE_C_EXTENSIONS OFF)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 为特定目标设置 C 标准
|
|
|
|
|
|
|
|
|
|
如果只想为某个目标设置 C 标准,可以使用 `target_compile_features` 或 `set_property`:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
add_executable(myTarget main.c)
|
|
|
|
|
|
|
|
|
|
# 设置 C 标准为 C11
|
|
|
|
|
target_compile_features(myTarget PRIVATE c_std_11)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
或者:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
add_executable(myTarget main.c)
|
|
|
|
|
|
|
|
|
|
# 设置 C 标准为 C11
|
|
|
|
|
set_property(TARGET myTarget PROPERTY C_STANDARD 11)
|
|
|
|
|
set_property(TARGET myTarget PROPERTY C_STANDARD_REQUIRED ON)
|
|
|
|
|
set_property(TARGET myTarget PROPERTY C_EXTENSIONS OFF)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 检查编译器支持的 C 标准
|
|
|
|
|
|
|
|
|
|
我们可以使用 `check_c_compiler_flag` 检查编译器是否支持某个标准:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
include(CheckCCompilerFlag)
|
|
|
|
|
check_c_compiler_flag(-std=c11 HAS_C11)
|
|
|
|
|
if (HAS_C11)
|
|
|
|
|
set(CMAKE_C_STANDARD 11)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "C11 is not supported by the compiler")
|
|
|
|
|
endif()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 设置支持的 C++ 标准
|
|
|
|
|
|
|
|
|
|
CMake 支持以下 C++ 标准版本:
|
|
|
|
|
|
|
|
|
|
- `98` 或 `cxx_std_98`:C++98/C++03 标准
|
|
|
|
|
|
|
|
|
|
- `11` 或 `cxx_std_11`:C++11 标准
|
|
|
|
|
|
|
|
|
|
- `14` 或 `cxx_std_14`:C++14 标准
|
|
|
|
|
|
|
|
|
|
- `17` 或 `cxx_std_17`:C++17 标准
|
|
|
|
|
|
|
|
|
|
- `20` 或 `cxx_std_20`:C++20 标准
|
|
|
|
|
|
|
|
|
|
- `23` 或 `cxx_std_23`:C++23 标准(如果 CMake 和编译器支持)
|
|
|
|
|
|
|
|
|
|
#### 设置全局 C++ 标准
|
|
|
|
|
|
|
|
|
|
使用 `set(CMAKE_CXX_STANDARD <version>)` 设置全局 `C++` 标准,这样所有编译目标都使用同一个的 `C++` 标准。
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
set(CMAKE_CXX_STANDARD 17) # 设置C++标准版本为 17
|
|
|
|
|
set(CMAKE_CXX_STANDARD 17) # 设置C++标准版本为C++17
|
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 要求必须满足C++标准版本要求,否则编译失败
|
|
|
|
|
set(CMAKE_CXX_EXTENSIONS ON) # 允许使用C++的扩展特性,否则编译失败
|
|
|
|
|
set(CMAKE_CXX_EXTENSIONS ON) # 允许使用编译器扩展(比如GNU拓展)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 为特定目标设置 C++ 标准
|
|
|
|
|
|
|
|
|
|
我们也可以通过设置编译目标属性来设置支持的 C++标准:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
@ -275,6 +363,36 @@ set_target_properties(myTarget PROPERTIES
|
|
|
|
|
)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
或者使用 `target_compile_features`:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
# 设置 C 标准为 C11
|
|
|
|
|
target_compile_features(myTarget PRIVATE c_std_11)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
或者使用 `set_property`:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
# 设置 C++ 标准为 C++17
|
|
|
|
|
set_property(TARGET myTarget PROPERTY CXX_STANDARD 17)
|
|
|
|
|
set_property(TARGET myTarget PROPERTY CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
set_property(TARGET myTarget PROPERTY CXX_EXTENSIONS OFF)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 检查编译器支持的 C++ 标准
|
|
|
|
|
|
|
|
|
|
我们可以使用 `check_cxx_compiler_flag` 检查编译器是否支持某个标准:
|
|
|
|
|
|
|
|
|
|
```cmake
|
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
|
check_cxx_compiler_flag(-std=c++17 HAS_CXX17)
|
|
|
|
|
if (HAS_CXX17)
|
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "C++17 is not supported by the compiler")
|
|
|
|
|
endif()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 设置地址无关代码
|
|
|
|
|
|
|
|
|
|
用标志 `-fPIC` 来设置地址无关代码(Position independent code)是常见操作的。大部分情况下,你不需要去显式的声明它的值。CMake 将会在 SHARED 以及 MODULE 类型的库中自动的包含此标志。如果你需要显式的声明,可以这么写:
|
|
|
|
|