1、configure_file() 命令:
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in" // 源文件(用户提供)
"${PROJECT_BINARY_DIR}/config.h" // 目标文件路径(由cmake生成,用户可在源代码中使用)
)
1.1 用于标识宏
- 在 CMake 配置时,
configure_file()
可以将config.h.in
中的占位符替换为具体的值,生成最终的config.h
文件。(注:名称可随意haha.h.in也行) - config.h.in
#cmakedefine USE_MYMATH
,这个使用#cmakedefine
就表示了这是个占位符,可以通过-D
选项在命令行中进行设置。例如:cmake -DUSE_MYMATH=OFF /path/to/source
,如果设置为OFF,则生成的config.h中,该宏被注释掉:/*#define USE_MYMATH*/
- config.h 通常用于在源代码中使用,例如条件编译,控制预处理器宏的定义。
1.2 用于变量
- 比如在ver.h.in中,
const char* ver = "${cf_example_VERSION}"
,这相当于设置了一个cmake变量cf_example_VERSION
,这里${}是取值操作,这个变量可以在CmakeLists.txt
中用set()来设置 - 然后再CmakeLists.txt文件中,设置变量值
set (cf_example_VERSION_MAJOR 0) set (cf_example_VERSION_MINOR 2) set (cf_example_VERSION_PATCH 1) set (cf_example_VERSION "${cf_example_VERSION_MAJOR}.${cf_example_VERSION_MINOR}.${cf_example_VERSION_PATCH}")
- 最后在你的源码中,包含头文件
ver.h
,就可以使用变量了,比如cout << ver << "\n";
2、option() 命令:
用于在 CMakeLists.txt
中定义一个 CMake 变量比如 USE_MYMATH
,并且默认值为ON。这个变量的值也可以在 CMake 配置时通过 -D
选项来修改。例如:cmake -DUSE_MYMATH=OFF /path/to/source
option(USE_MYMATH "Use provided math implementation" ON)
option()
通常用于控制 CMakeLists.txt 中的条件编译逻辑
,影响生成的构建系统和代码
比如在CmakeLists.txt中:
option(USE_MYMATH "Use provided math implementation" ON) // 默认为ON,可以通过-DUSE_MYMATH=OFF 来修改
if (USE_MYMATH) // 这里根据它的值来决定是否用math这个我们自定义的库
include_directories ("${PROJECT_SOURCE_DIR}/math")
add_subdirectory (math)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
重点:.h.in
文件和 option()
命令分别定义了一个变量 USE_MYMATH
,它们之间是相互独立的。.h.in 文件中的 USE_MYMATH
是在 configure_file()
运行时被替换的。-DUSE_MYMATH
是用于在 CMake 运行时通过命令行设置变量的一种方式。如果你使用 -DUSE_MYMATH=OFF,那么这个值会影响到 CMake 中 option() 定义的变量,同时也会在 configure_file()
运行时替换 .h.in
文件中的相应占位符。
所以,这两种设置方式互相独立,但在最终的配置过程中,它们会共同影响到 config.h 文件的生成。
一般来说
- option() 定义的cmake变量的作用域是
CMakeLists.txt
,用于控制 CMake 构建时的条件逻辑。 - configure_file() 命令的源文件中的变量或宏的作用域是
源代码
,用于在编译时通过预处理器宏来影响源代码的编译行为,或者生成一些变量或代码,以供使用。
顺带说一句,标识宏和常量宏定义方法不太一样
标识宏(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_definitions
或target_compile_definitions
在CMakeLists.txt
文件中定义。 - 例如,在
CMakeLists.txt
中定义:add_compile_definitions(MAX=65536)
这将在编译时将 MAX 定义为 65536,在代码中使用它作为一个常量值。