cmake学习之macroa宏定义
[TOC]
文章参考:https://www.h3399.cn/201802/546661.html
文章参考:https://cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html
概述
引入在C++程序中我们经常见到如下,两个问题:
输出当前程序的版本号
通过cmake添加macro宏定义 出入到源文件,例如在编译opencv caffe的时候,我们通过cmake -DUSE_CUDA=ON/OFF来确定,是否使用cuda.
问题cmake中如何实现上述两个功能的呢?
至于问题1:
我们可能想到直接在头文件中定义,这样也可以,但是如果直接在cmake中定义,然后传递给程序读取生成更加灵活。
至于问题2:
可以在cmake中通过option函数
以及add_definitions函数
来实现。
宏和函数(macro vs function)
宏macro定义与应用
1 | macro(<name> [arg1 [arg2 [arg3 ...]]]) |
- macro:宏关键字
- name:宏名称
- arg1:宏参数
宏的定义与使用方式与函数相同,可参考随笔进行简单理解。本文侧重对比宏与函数区别。
定义一个名称为 name 的宏,arg1… 是传入的参数我们除了可以用 ${arg1} 来引用变量以外, 系统为我们提供了一些特殊的变量:
变量 | 说明 |
---|---|
ARGV# | # 是一个下标,0 指向第一个参数,累加 |
ARGV | 所有的定义时要求传入的参数 |
ARGN | 定义时要求传入的参数以外的参数,比如定义宏(函数)时,要求输入 1 个,书记输入了 3 个,则剩下的两个会以数组形式存储在 ARGN 中 |
ARGC | 传入的实际参数的个数,也就是调用函数是传入的参数个数 |
macro 宏定义与 function 函数的不同点
cmake_parse_arguments
cmake_parse_arguments
为解析函数(function)或 宏(macros) 参数的命令;
1 | cmake_parse_arguments(<prefix> <options> <one_value_keywords> |
参数解析:
**<prefix>
**前缀, 解析出的参数都会按照 prefix_参数名
的形式形成新的变量;
<options>
: 可选值
- 此处包含可选项的变量名称, 对应的值为
TRUE
或FALSE
; - 如果传递进来的参数包含此变量,则为
TRUE
反之为FALSE
<one_value_keywords>
: 单值关键词列表
- 每个关键词仅仅对应一个值
<multi_value_keywords>
: 多值关键词列表
- 每个关键词可对应多个值
<args>...
参数, 一般传入 ${ARGN}
即可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 麦溪·在路上!
评论
ValineDisqus