[TOC]

文章参考:https://www.h3399.cn/201802/546661.html

文章参考:https://cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html

概述

引入在C++程序中我们经常见到如下,两个问题:

  1. 输出当前程序的版本号

  2. 通过cmake添加macro宏定义 出入到源文件,例如在编译opencv caffe的时候,我们通过cmake -DUSE_CUDA=ON/OFF来确定,是否使用cuda.

问题cmake中如何实现上述两个功能的呢?

至于问题1:

我们可能想到直接在头文件中定义,这样也可以,但是如果直接在cmake中定义,然后传递给程序读取生成更加灵活。

至于问题2:

可以在cmake中通过option函数以及add_definitions函数来实现。

宏和函数(macro vs function)

宏macro定义与应用

1
2
3
4
5
macro(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endmacro(<name>)
  • 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
2
3
4
5
6
cmake_parse_arguments(<prefix> <options> <one_value_keywords>
<multi_value_keywords> <args>...)


cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
<one_value_keywords> <multi_value_keywords>)

参数解析:

**<prefix>**前缀, 解析出的参数都会按照 prefix_参数名 的形式形成新的变量;

<options>: 可选值

  • 此处包含可选项的变量名称, 对应的值为 TRUEFALSE;
  • 如果传递进来的参数包含此变量,则为 TRUE 反之为 FALSE

<one_value_keywords>: 单值关键词列表

  • 每个关键词仅仅对应一个值

<multi_value_keywords>: 多值关键词列表

  • 每个关键词可对应多个值

<args>... 参数, 一般传入 ${ARGN} 即可