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

2023-12-16 03:05:45

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
    #cmakedefine USE_FEATURE_XYZ
    
    • 通过-D命令设为ON 或 OFF
    • 用户可以通过 CMake 的 configure_file() 来生成 config.h,然后在代码中使用它来控制条件编译。

常量宏(Constant Macro):

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

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

文章来源:https://blog.csdn.net/Motarookie/article/details/135021605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。