cmake中的configure_file() 和option()命令

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_definitionstarget_compile_definitionsCMakeLists.txt 文件中定义。
  • 例如,在 CMakeLists.txt 中定义:
    add_compile_definitions(MAX=65536)
    

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

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的`CMakeLists.txt``configure_package_config_file()`函数的使用例子: ```cmake # 设置安装目录 set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for headers") # 配置文件模板 configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/MyProjectConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfig.cmake" INSTALL_DESTINATION ${INSTALL_LIB_DIR}/cmake/MyProject ) # 安装目标 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfig.cmake" DESTINATION ${INSTALL_LIB_DIR}/cmake/MyProject ) # 安装头文件和库文件 install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${INSTALL_INCLUDE_DIR} ) install( TARGETS myproject EXPORT MyProjectTargets DESTINATION ${INSTALL_LIB_DIR} ) ``` 这个例子,我们首先定义了安装目录的路径,然后使用`configure_package_config_file()`函数生成了一个`MyProjectConfig.cmake`文件,并将这个文件安装到指定的目录下。这个函数需要传入两个参数,第一个参数是配置文件模板的路径,第二个参数是生成的配置文件的路径,其模板文件可以使用`@PACKAGE_NAME@`、`@PACKAGE_VERSION@`等变量,这些变量会被自动替换为实际的值。我们还通过`INSTALL_DESTINATION`参数指定了生成的配置文件的安装目录。 最后,我们使用`install()`函数将目标文件安装到指定的目录下。这个例子,我们将生成的`MyProjectConfig.cmake`文件安装到`${INSTALL_LIB_DIR}/cmake/MyProject`目录下,将头文件安装到`${INSTALL_INCLUDE_DIR}`目录下,将库文件安装到`${INSTALL_LIB_DIR}`目录下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗浩多捞

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值