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_definitions
或target_compile_definitions
在CMakeLists.txt
文件中定义。 - 例如,在
CMakeLists.txt
中定义:add_compile_definitions(MAX=65536)
这将在编译时将 MAX 定义为 65536,在代码中使用它作为一个常量值。
文章来源:https://blog.csdn.net/Motarookie/article/details/135021605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!