cmake中的configure() 和option()命令的宏定义作用域问题

option() 命令:

option(USE_MYMATH "Use provided math implementation" ON)
  • 用于在 CMakeLists.txt 中定义一个 CMake 变量 USE_MYMATH,并且默认值为ON。这个变量的值可以在 CMake 配置时通过 -D 选项来修改。例如:cmake -DUSE_MYMATH=OFF /path/to/source
  • option() 通常用于控制 CMakeLists.txt 中的条件编译逻辑,影响生成的构建系统和代码。比如:
    if (USE_MYMATH)
      	include_directories ("${PROJECT_SOURCE_DIR}/math")
      	add_subdirectory (math)  
      	set (EXTRA_LIBS ${
         EXTRA_LIBS} MathFunctions)
    endif (USE_MYMATH)
    

configure_file() 命令:

configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"	// 自己写的
  "${PROJECT_BINARY_DIR}/config.h"		// 由cmake生成,让用户在源代码中使用的
  )
  • configure_file() 用于在 CMake 配置时,将 config.h.in 中的占位符替换为具体的值,生成最终的 config.h 文件。
  • config.h.in 中的占位符可以使用 @ 符号包裹,例如 #define USE_MYMATH @USE_MYMATH@ .这个占位符的具体值也可以通过 -D 选项在命令行中传递。例如:cmake -DUSE_MYMATH=OFF /path/to/source,则生成的config.h中,该宏被注释掉:/*#define USE_MYMATH*/
  • config.h 通常用于在源代码中使用,例如条件编译,控制预处理器宏的定义。

虽然这两者都涉及 USE_MYMATH 的设置,但它们的作用域用途是不同的:

  • option() 的作用域是 CMakeLists.txt,用于控制 CMake 构建时的条件逻辑。
  • config.h 的作用域是 源代码,用于在编译时通过预处理器宏来影响源代码的编译行为。

这两者的目的是为了提供不同的灵活性:option() 用于配置 CMake 的构建逻辑,而 config.h 用于在源代码中灵活地控制编译选项。


顺带说一句,标识宏和常量宏定义方法不太一样

标识宏(Identity Macro):

  • 这类宏通常被用作开关或标志,用于条件编译。在 config.h 文件中使用,通过预处理器宏的定义或注释来控制代码的编译。

  • 例如,在 config.h.in 中定义:

    // config.h.in
    #define USE_FEATURE_XYZ
    

    用户可以通过 CMake 的 configure_file() 来生成 config.h,然后在代码中使用它来控制条件编译。

常量宏(Constant Macro):

  • 这类宏通常用于定义常数或配置值,例如定义某个固定的最大值。可以使用 add_compile_definitionstarget_compile_definitionsCMakeLists.txt 文件中定义。
  • 例如,在 CMakeLists.txt 中定义:
    add_compile_definitions(MAX=65536)
    

这将在编译时将 MAX 定义为 65536,在代码中使用它作为一个常量值。

相关推荐

  1. C++作用

    2023-12-16 01:52:03       33 阅读
  2. Python教程:深入理解Python命名空间作用

    2023-12-16 01:52:03       11 阅读
  3. Python名称空间作用

    2023-12-16 01:52:03       38 阅读
  4. Rust Option、Result ? 运算符

    2023-12-16 01:52:03       33 阅读
  5. Kotlin 作用函数

    2023-12-16 01:52:03       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 01:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 01:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 01:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 01:52:03       20 阅读

热门阅读

  1. 时光机器:用rrweb打造可回溯的用户体验!

    2023-12-16 01:52:03       40 阅读
  2. Go 1.21 新内置函数:min、max 和 clear

    2023-12-16 01:52:03       33 阅读
  3. ESP32网络开发实例-Web串口(WebSerial)

    2023-12-16 01:52:03       37 阅读
  4. day17 二叉树的所有路径

    2023-12-16 01:52:03       31 阅读
  5. 记录 | docker启动权限问题Get Permission Denied

    2023-12-16 01:52:03       32 阅读
  6. js 获取元素宽高的几种方法

    2023-12-16 01:52:03       33 阅读
  7. Future设计模式

    2023-12-16 01:52:03       31 阅读
  8. 包管理工具npm与yarn

    2023-12-16 01:52:03       33 阅读