本文是 cmake 使用的第八篇,主要介绍如何设置编译标志,以便于在代码中使用预编译宏。
上一篇的链接为:https://blog.csdn.net/QCZL_CC/article/details/119825969
目录结构如下:
06-compile-flags/
├── CMakeLists.txt
└── main.c
其中 main.c 内容如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("Hello cmake ! test compile flags\n");
#ifdef DEBUG_TEST
printf("this is a test line...\n");
#endif
return 0;
}
可以看到代码中判断了 DEBUG_TEST 宏。如果编译代码时没有指定 DEBUG_TEST 宏,则其包裹的代码不会被编译和执行。
CMakeLists.txt 规则如下:
cmake_minimum_required(VERSION 3.5)
# CMake 支持以多种不同方式设置编译标志:
# 1: 使用 target_compile_definitions() 函数设置
# 2: 使用 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 变量
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DEX2" CACHE STRING "Set C Compiler Flags" FORCE)
project (compile_flags)
add_executable(cmake_examples_compile_flags main.c)
# 在现代 CMake 中设置 C++ 标志的推荐方法是使用每个目标标志,这些标志可以通过 target_compile_definitions() 函数填充到其他目标
# 这将填充库的 INTERFACE_COMPILE_DEFINITIONS 并根据范围将定义推送到链接目标
arget_compile_definitions(cmake_examples_compile_flags
PRIVATE DEBUG_TEST
)
上面的规则中使用了2种方式设置编译标志分别设置了 EX2 和 DEBUG_TEST 2个标志。
1、使用 cmake 变量 CMAKE_C_FLAGS
2、使用 target_compile_definitions 函数
编译日志如下:
可以看到编译时添加了2个标志: /usr/bin/cc -DDEBUG_TEST -DEX2
代码运行结果如下:
可以看到被 DEBUG_TEST 宏包裹的这部分代码被编译了,并且可以正常执行到。
下面我们改变 CMakeLists.txt 内容,注释掉设置 DEBUG_TEST 标志的部分,更改后规则如下:
cmake_minimum_required(VERSION 3.5)
# CMake 支持以多种不同方式设置编译标志:
# 1: 使用 target_compile_definitions() 函数设置
# 2: 使用 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 变量
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DEX2" CACHE STRING "Set C Compiler Flags" FORCE)
project (compile_flags)
add_executable(cmake_examples_compile_flags main.c)
# 在现代 CMake 中设置 C++ 标志的推荐方法是使用每个目标标志,这些标志可以通过 target_compile_definitions() 函数填充到其他目标
# 这将填充库的 INTERFACE_COMPILE_DEFINITIONS 并根据范围将定义推送到链接目标
#arget_compile_definitions(cmake_examples_compile_flags
# PRIVATE DEBUG_TEST
#)
更改后再执行编译过程,可以发下编译时没有添加 DEBUG_TEST 标志
然后我们执行代码,发现 DEBUG_TEST 包裹部分的代码并没有执行
下一篇:https://blog.csdn.net/QCZL_CC/article/details/119827150,主要介绍如何使用 cmake 导入已经编译好的第三方库。