cmake(13):构建时设置预处理宏定义以及add 您所在的位置:网站首页 z650rs发布会 cmake(13):构建时设置预处理宏定义以及add

cmake(13):构建时设置预处理宏定义以及add

2023-08-21 08:40| 来源: 网络整理| 查看: 265

目录

1. 说明

1.1 无参宏

1.2 有参宏

2. 使用示例

3. 命令解析

add_compile_definitions 命令

add_definitions 命令

参考链接

1. 说明

宏定义在程序设计中几乎是不可避免会用到的,在控制程序运行上有非常重要的作用。除了在源代码中使用 #define 预处理命令定义的宏,我经常会在编译时根据具体需要选择定义某些宏或者绕过某些宏,以期同一套代码能符合多种场景需求。

对于使用 cmake 构建的软件,我们不再需要写 Makefile 也不用直接执行 gcc 等编译命令,为了满足上述需求,cmake 也提供了多种方法让用户能够在编译时自定义宏定义。

1.1 无参宏

假设我们的目标是要在程序中定义一个没有具体值的宏(通常用于一些编译开关之类的),比如:

#define NONE_VALUE_MACRO

cmake 命令行

可以在使用 cmake 命令构建时,添加 /D[MACRONAME] 参数可以在编译时手动选择定义宏参数。

cmake /DNONE_VALUE_MACRO ..

这样的优点是灵活,可以完全不修改代码的情况下选择要定义的宏。缺点嘛,就是麻烦,尤其是有多个宏定义的时候。反正我是不喜欢输入太长的命令的。

需要注意的是,命令行不能直接对源代码生效,而是影响 CMakeLists.txt 文件的执行,所以要上述命令生效,还需要在 CMakeLists.txt 中添加相应语句。

add_definitions 命令

这个命令是 cmake 较早版本就实现的,特点是使用时要在宏名称前添加 "-D" 前缀。

add_definitions(-DNONE_VALUE_MACRO)

add_compile_definitions 命令

这个命令是 cmake v3.12 后添加的,相比于 add_difinitions,功能更加单一且参数使用灵活。

add_compile_definitions(NONE_VALUE_MACRO)

1.2 有参宏

假设要定义一个有具体值的宏:

#define VALUE_MACRO 0x10000000

cmake 命令行

在定义有参宏时,要使用 "-D" 而非 "/D",前者遵循 [VAR:type=value] 的格式,即在定义宏要指定具体值。

cmake -DVALUE_MACRO=0x10000000 ..

add_definitions 命令

add_definitions(-DNONE_VALUE_MACRO=0x10000000)

add_compile_definitions 命令

add_compile_definitions(VALUE_MACRO=0x10000000)

注:

-D 或 /D 后与宏名称直接可以有空格也可以没有cmake 官方建议不再使用 add_definitions 而用 add_compile_definitions

2. 使用示例

compile.c

#include int main() { printf("This process is used to testing compiler definition in cmake.\n"); #ifdef COMPILE_M1 printf("Defined macro: COMPILE_M1\n"); #endif #if COMPILE_M2 == 0x100 printf("Macro COMPILE_M2: 0x%x\n", COMPILE_M2); #endif #if COMPILE_M3 == 0x200 printf("Macro COMPILE_M3: 0x%x\n", COMPILE_M3); #endif #ifdef COMPILE_M4 printf("Macro COMPILE_M4 is defined by cmake command\n"); #endif return 0; }

CMakeLists.txt

cmake_minimum_required (VERSION 3.13.0) project (cmake_test VERSION 0.0.4) add_definitions (-DCOMPILE_M1) add_definitions (-DCOMPILE_M2=0x100) add_compile_definitions (COMPILE_M3=0x200) if(COMPILE_M4) add_compile_definitions (COMPILE_M4) endif() add_executable(compile compile.c)

编译运行

mkdir build && cd build cmake .. #或 cmake /DCOMPILE_M4 .. make

3. 命令解析 add_compile_definitions 命令

这个命令是 cmake v3.12 版本添加的特性,用于将预处理器定义添加到源文件的编译中。

预处理器定义被添加到当前 CMakeLists 文件的 COMPILE_DEFINITIONS 目录属性中。它们也被添加到当前 CMakeLists 文件中每个目标的 COMPILE_DEFINITIONS 目标属性中。

使用语法 VAR 或 VAR=value 指定定义。不支持函数样式定义。 CMake 将自动为本机构建系统正确转义值(请注意,CMake 语言语法可能需要转义来指定某些值)。

其命令格式如下:

add_compile_definitions( ...)

add_compile_definitions 的参数可以使用语法为 $ 的“生成器表达式”。如:

set(VAR_TESTCASE_CONFIG_FILE \"testcases.json\") add_compile_definitions(TESTCASE_CONFIG_FILE="${VAR_TESTCASE_CONFIG_FILE}")

add_definitions 命令

将 -D 定义标志添加到源文件的编译中。将定义添加到当前目录中的目标的编译器命令行,无论是在调用此命令之前还是之后添加,以及之后添加的子目录中的目标。此命令可用于添加任何标志,但它旨在添加预处理器定义。

add_definitions(-DFOO -DBAR ...)

以 -D 或 /D 开头的看起来像预处理器定义的标志会自动添加到当前目录的 COMPILE_DEFINITIONS 目录属性中。具有非平凡值的定义可能会留在标志集中,而不是出于向后兼容性的原因进行转换。

cmake 官方建议现在使用其他的命令来代替这个命令:

add_compile_definitions() : 添加预处理器定义include_directories() : 添加 include 目录add_compile_options() : 添加编译选项

参考链接

CMake定义宏的方式_风闲1217的博客-CSDN博客_cmake 宏定义

add_definitions — CMake 3.24.0-rc2 Documentation

add_compile_definitions — CMake 3.24.0-rc2 Documentation



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有