CMake之Option使用简介

CMake之Option使用简介



前言

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测试程序

示例项目的功能如下:

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

主工程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中选项的定义,进行子项目本身的编译。

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值