CMake之Option使用简介

3 篇文章 2 订阅

CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。

基本格式

options基本格式如下:

option(<variable> "<help_text>" [value])
  • variable:定义选项名称
  • help_text:说明选项的含义
  • value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF

示例

示例项目结构如下:
在这里插入图片描述

  • build:工程编译目录
  • CMakeList.txt:cmake主编译脚本
  • sub:子工程目录,sub子目录相当于一个子工程,用于演示主工程选项和子工程选项之间的关系。
  • test.c测试程序

示例项目的功能如下

  1. 说明cmake选项的基本用法。
  2. 说明如何通过cmake的选项,控制C程序条件编译。
  3. 说明主项目和子项目之间,同一选项之间的关系。

主工程CMakeList.txt编译脚本:

#Cmake 最低版本要求
cmake_minimum_required(VERSION 3.16)
 
#项目名称
project(CMakeExp)
 
message(STATUS "CMakeExpMaster.") 
#set(TEST_OPTION OFF)
 
option(TEST_OPTION "test opiton" ABC)
 
if (DEFINED TEST_OPTION)
        message(STATUS "TEST_OPTION defined: " ${TEST_OPTION})
else ()     
        message(STATUS "TEST_OPTION un-defined: " ${TEST_OPTION})
endif()
 
if (TEST_OPTION)
        message(STATUS "TEST_OPTION ON.")
        add_definitions(-DTEST_OPTION)
else ()
        message(STATUS "TEST_OPTION OFF.")
endif()
 
if (NOT TEST_OPTION)
        message(STATUS "NOT-TEST_OPTION ON.")
else ()
        message(STATUS "NOT-TEST_OPTION OFF.")
endif()      
                                                                                                                                                          
add_subdirectory(sub)
add_executable(test test.c)

子工程编译脚本:

#Cmake 最低版本要求                                                                                                                                                    
cmake_minimum_required(VERSION 3.16)
 
#项目名称
project(CMakeExpSub)
 
message(STATUS "\n\nCMakeExpSub.") 
 
option(TEST_OPTION "test opiton" ON) 
 
if (DEFINED TEST_OPTION)
        message(STATUS "TEST_OPTION defined: " ${TEST_OPTION})
else ()
        message(STATUS "TEST_OPTION un-defined: " ${TEST_OPTION})
endif()
 
if (TEST_OPTION)
        message(STATUS "TEST_OPTION ON.")
else ()
        message(STATUS "TEST_OPTION OFF.")
endif()

test.c程序内容:

#include <stdio.h>                                                                                                                                                     
int main(void)
{
#ifdef TEST_OPTION
        printf("Hello, CMake.\n");
#endif
        return 0;
}

基本用法

主项目里定义的一个TEST_OPTION选项,如下:

option(TEST_OPTION "test opiton" ON)

下面对于TEST_OPTION选项定义,进行了测试:

if (DEFINED TEST_OPTION)
        message(STATUS "TEST_OPTION defined: " ${TEST_OPTION})
else ()
        message(STATUS "TEST_OPTION un-defined: " ${TEST_OPTION})
endif()
 
if (TEST_OPTION)
        message(STATUS "TEST_OPTION ON.")
else ()
        message(STATUS "TEST_OPTION OFF.")
endif()

进入build目录,执行cmake编译,结果如下:

$ cmake ..

在这里插入图片描述
在执行cmake时,可以使用-D+选项名称,修改选项的值,如下:

$cmake  .. -DTEST_OPTION=OFF

在这里插入图片描述
cmake执行完成之后,选项的值会保存到CMakeCache.txt中。
在这里插入图片描述

C程序条件编译

通过判断选项的值,可以通过 add_definitions()定义相关的宏,已达到控制C程序条件编译流程。

示例中,如果TEST_OPTION选项的值是ON,那么就会定义TEST_OPTION宏,这样在test.c中就可以通过判断TEST_OPTION的声明情况,来控制编译流程。

#ifdef TEST_OPTION
        printf("Hello, CMake.\n");
#endif

这里,如果TEST_OPTION宏被定义,那么test就会打印"Hello,CMake.
在这里插入图片描述
可以看到,test输出了“Hello,CMake.”。

主、次项目之间选项的关系

示例项目中,包括一个子项目,里面也定义了一个CMakeList.txt脚本,里面也定义了和主项目相同的选项TEST_OPTION,下面展示一下主、子项目之间,同一选项之间的关系。

主项目定义:

 option(TEST_OPTION "test opiton" ON) 

子项目定义:

option(TEST_OPTION "test opiton" OFF)

在这里插入图片描述
可以看到,虽然子项中TEST_OPTION选项定义为了OFF,但是,由于主项目中TEST_OPTION选项的值是ON,导致子项目的选项值变为了ON,可以看出,对于同一选项,子项目值遵循主项目的定义。

注意:对于这种,主、次架构的项目来说,整个工程只有一个CMakeCache.txt,其位于主项目的编译目录下,子项目会根据次此CMakeCache.txt中选项的定义,进行子项目本身的编译。

  • 31
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值