`
doujiu
  • 浏览: 88890 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

cmake预定义变量和执行流程控制

阅读更多
《你所不知的OSG》第一章:CMake初步(2) - OpenSceneGraph教程专区 - OpenSceneGraph中国讨论区-有您OSG在中国才更好 - Powered by Discuz!
也许您并不一定完全明白这里所说的每一句话,这也是我们之所以把词法和语法的介绍放在“Hello World”例子之后的一个原因——没错,仅仅是这些单词的罗列未免太枯燥了。那么,为什么不马上拾起我们刚刚才完成的简单脚本工程,在上面添砖加瓦一番呢?说不定这才是您充分理解和深入学习CMake的关键呢。

是的,实践才是最好的老师。要充分理解CMake的强大之处,以及确保自己具备足够的力量去阅读OSG的CMake脚本源代码,势必还要再多做一些更为复杂的练习才行。不过在此之前,我们还是再多了解一些CMake的常用内置变量和脚本命令,以及CMake中条件语句,循环语句和宏函数的概念用法。

包括前文介绍的PROJECT_SOURCE_DIR在内,以下内置全局变量都可以在CMake脚本中以“${…}”的形式直接加以应用,以方便脚本代码的定位和功能实现:


* CMAKE_BUILD_TYPE:工程的编译生成的版本类型,可选项包括Debug,Release,RelWithDebInfo和MinSizeRel。
* CMAKE_COMMAND:也就是CMake可执行文件本身的全路径,例如/usr/local/bin/cmake或者C:\Program Files\CMake 2.6\bin\cmake.exe。
* CMAKE_DEBUG_POSTFIX:Debug版本生成目标的后缀,通常可以设置为“d”字符,例如Debug版本的OSG核心库为osgd.dll,而Release版为osg.dll。
* CMAKE_GENERATOR:编译器名称,例如“Unix Makefiles”,“Visual Studio 7”等。
* CMAKE_INSTALL_PREFIX:工程安装目录,所有生成和调用所需的可执行程序,库文件,头文件都会安装到该路径下,Unix/Linux下默认为/usr/local,Windows下默认为C:\Program Files。
* CMAKE_MODULE_PATH:设置搜索CMakeModules模块(.cmake)的额外路径。
* PROJECT_BINARY_DIR:工程生成工作所在的目录,即前文所述的“out-of-source”的目录;对于“in-source”形式的编译工作,该变量与PROJECT_SOURCE_DIR所指向的目录相同。
* PROJECT_NAME:工程名称,即使用PROJECT命令设置的名称。
* PROJECT_SOURCE_DIR:工程源代码文件所在的目录。
* CYGWIN:标识当前系统是否为Cygwin。
* MSVC:标识当前系统是否使用Microsoft Visual C。
* UNIX:标识当前系统是否为Unix系列(包括Linux,Cygwin和Apple)。
* WIN32:标识当前系统是否为Windows及Win64。



不必担心这里介绍的命令和变量太多,也不必担心它们会很快消失在您的脑海深处。下一节我们将尝试创建一个稍微复杂一些的工程VersionMe,并争取将上文涉及到的大部分命令和内置变量派上用场,以求在实战中让您领略到CMake的强大魅力。

不过在结束枯燥的本章之前,我们还需要介绍一下CMake中重要的条件语句语法,循环语句语法和宏函数。它们分别相当于C程序中的if…else,while/for以及函数的作用,并且条件和循环语句都可以嵌套工作。毫无疑问,它们在脚本语言的流程控制过程中必然不可或缺。

CMake中的条件语句基本格式为:

1. IF( expression )
2. …
3. ELSE( expression )
4. …
5. ENDIF( expression )

复制代码
或者,

1. IF( expression1 )
2. …
3. ELSEIF( expression2 )
4. …
5. ELSE()
6. …
7. ENDIF()

复制代码
这里的expression是判断条件,和C/C++类似,CMake的条件也存在“与/或/非”以及“等于/大于/小于”等几种操作符,分别用AND/OR/NOT以及EQUAL/LESS/GREATER来表示。当判断条件为真,执行IF后的命令段,否则继续判断并执行相应条件对应的命令段,或者不执行任何操作。例如:

1. IF ( ${number} GREATER 4 )
2. …
3. ENDIF( ${number}GREATER 4 )

复制代码
表示判断变量number是否大于4,进而执行对应的语句段。此时用户定义的字符串变量会被自动转换为整型变量以便进行判断。
此外形同这样的判断语句也是十分常见的:

1. IF ( NOT ${variable} )
2. …
3. ENDIF( NOT ${variable} )

复制代码
如果变量variable的值为空,0,N,NO,OFF,FALSE,NOTFOUND这几种之一的话,则认为此变量表示“假”,即此处的“NOT ${variable}”为真。

CMake中的循环语句基本格式为:

1. FOREACH( var arg1 arg2 … )
2. …
3. ENDFOREACH( var )

复制代码
这里设置一个循环的局部变量var,每次将其赋为arg1,arg2等变量(或者变量数组)中的一个值,并执行循环中的命令段。例如:

FOREACH( var ${OPENGL_LIBRARIES} ),它表示将局部变量var每次设置为变量OPENGL_LIBRARIES中的一个值。后者的内容可能为“opengl32.lib;glu32.lib”的形式。

CMake自动将分号分隔的字符串认为是数组,因此会自动从该变量中择取var的取值。

另一种表达循环语句的语法格式为:

1. WHILE ( expression )
2. …
3. ENDWHILE( expression )

复制代码
这里的expression和IF语句判断字段中的含义相同。

CMake中的宏函数可以理解为C语言的函数,它改变代码执行跳转的流程并简化了脚本程序的开发,其基本格式为:

1. MACRO( funcname [arg1 [arg2 …]] )
2. …
3. ENDMACRO( funcname )

复制代码
和函数的编写要求一样,CMake的宏函数必须指定一个函数名funcname,以及零个或多个输入参数arg1,arg2等。需要调用宏函数的时候,只要直接使用funcname(arg1 arg2)的形式就可以了,例如:

1. MACRO( MY_FUNC arg1 arg2 )
2. …
3. ENDMACRO( MY_FUNC )

复制代码
在主程序中,需要调用此宏函数时,只需执行形同下面的语句:

1. MYFUNC( param1 param2 )

复制代码
就可以将实际参数param1和param2传入宏函数体。

此外,宏函数体内可以使用内置变量${ARGC},${ARGV}和${ARGN}来表达传入参数的属性:${ARGC}保存了传入参数的个数;${ARGV}保存一个传入参数组成的数组,可以供FOREACH语句使用;${ARGN}则比较特殊,它保存了“显式参数”之外的所有“隐式参数”所组成的数组。对于上面的例句来说,arg1,arg2就是显式参数,而如果用户在调用MY_FUNC时采用下面的形式:

1. MYFUNC( param1 param2 other1 other2 … )

复制代码
那么other1,other2等就是隐式参数,可以用${ARGN}来获取它们的数组。这对于CMake而言是完全合法的,并且可以因此定义不定参数项的宏函数,从而大大增强了脚本程序的灵活性。


分享到:
评论

相关推荐

    cmake-3.23.2-windows-x86-64.msi

    安装程序会自动将CMake相关的文件和依赖项安装到合适的目录,并设置必要的环境变量和系统路径。 通过安装cmake-3.23.2-windows-x86_64.msi,您可以快速开始使用CMake进行Windows平台上的项目构建,利用其强大的功能...

    CentOS 7.0编译安装cmake和mysql安装包

    vi /etc/profile #把mysql服务加入系统环境变量:在最后添加下面这一行 export PATH=$PATH:/usr/local/mysql/bin :wq! #保存退出 source /etc/profile #使配置立刻生效 下面这两行把myslq的库文件链接到系统默认...

    基于whisper的AI字幕提取工具

    官网版本和开源版本的区别在于官网版本需要微信扫码登录,开源版本完全剥离掉了登录认证的流程。 1.安装 1.1 安装npm依赖 npm install 1.1 编译whisper 注意:编译过程需要依赖cmake程序,可以在这里下载cmake安装...

    C/C++从零开始的cmake教程

    C/C++从零开始的CMake教程 如果你有过在linux系统上源码安装某款软件的经历,那么肯定对这三部曲一点都不会陌生——配置(configure)、编译(make)、安装(make install)。几乎每次都是机器人般的操作,这背后其实是...

    apache:阿帕奇 2.4.x

    如何 apache 2.4 构建基于 将 zip 解压缩到一个文件夹确保您已经安装了先决条件并设置了 PATH 变量(安装程序中的复选框): 视觉工作室 VC11 视窗 SDK 8 Python(PATH 变量集) Perl(PATH 变量集) Cmake(PATH ...

    vscode安装leetcode-LeetCodeCplus:力码Cplus

    mingw,所以第一次需要执行:cmake -G "MinGW Makefiles" mkdir build cd build cmake .. -G "MinGW Makefiles" make 也可以指定编译运行单个程序 make {ID}.{name} 编译、调试、单测都可以在 cmake 的工具栏里处理

    CleanSARIF:基于GUI的小型SARIF文件CleanerReducer

    一些控制各种功能的编译的CMake变量是: Qt5_DIR -Qt5安装中cmake文件夹的位置。 BUILD_TESTING默认为true,下载Catch2并构建单元测试框架。 BUILD_DOCUMENTATION默认为false。 如果为true,并且您已安装Doxygen...

    pico-tflmicro:Pico TensorFlow Lite端口

    完成此操作后,请确保将PICO_SDK_PATH环境变量设置为Pico SDK的位置,无论是在您正在构建的外壳中,还是在扩展的CMake configure环境变量设置中(如果您使用的是VS Code) 。然后,您应该能够构建库,测试和示例。最...

    利用OpenCV和MFC对话框建设一个有滑动条控制的播放器源代码

    配置Windows环境变量Path,将OpenCV2.0安装后的bin文件夹目录添加入用户变量 // 使得Path=.../bin // (...是OpenCV2.0安装后的program files下的目录全路径) // 6. 打开VC++ 2008,菜单中的工具→选项→项目和...

    dftbplus:DFTB +通用软件包,用于执行快速原子模拟

    DFTB +:用于执行快速原子计算的通用软件包 DFTB +是用于基于密度... 如果您的环境不提供CMake或仅提供旧版本,则可以通过Python的pip命令轻松安装最新的CMake: pip install cmake通过将编译器作为环境变量( FC和CC

    DFT的matlab源代码-snap_cam_manager:该存储库包装了用于SnapdragonFlight相机应用程序的libcamer

    您还必须提供以下cmake变量: cmake -DQC_SOC_TARGET=APQ8096 要求 尝试构建之前,请确保在目标上存在Snapdragon Flight libcamera标头,该标头应在/usr/include/camera.h和/usr/include/camera_parameters.h找到。 ...

    TriEngine_

    使用nCine制作的应用程序和游戏的模板项目。 大多数项目将使用此脚本系统提供的大量定制功能。 他们将能够针对所有引擎支持的平台:Linux,macOS,Windows,MinGW,Android和Emscripten。 客制化 包装信息 要为您...

    订单分批matlab代码-idla-person-reid:dlib实现的“用于人员重新识别的改进的深度学习体系结构”

    订单分批matlab代码用于人员重新识别的改进的深度学习架构 该存储库实现了中描述的网络。 用于执行此操作的主要深度学习库是。...DLIB_DIR变量通知CMake在哪里寻找dlib 。 必须将其定义为环境变量或通过-DDLIB_DI

    realtime-logpolar-filtering

    为了在计算步骤中实现更大的加速,关于可并行化代码段的算法将在GPU(图形处理单元)上执行,以利用此硬件提供的数据并行性,线程和指令 程序流程图 视皮层转化 双线性插值 威尔逊模型 2013幻灯片演示: : ...

    synthgen-particles-win:4k入门中的无状态粒子系统

    合成粒子(Windows版) ... 特别是,它包含许多特定于平台的代码,使用全局变量,旧版OpenGL功能和不安全的C样式字符串函数来减小生成的代码大小。 控制项 该演示支持各种粒子系统参数的控制: 键1

    毕业设计视频会议源码-OS_Projects:上帝保佑我,手指交叉

    编译器基础设施项目(以前称为低级虚拟机)是“模块化和可重用编译器和工具链技术的集合”,用于开发编译器前端和后端。 LLVM 程序员手册: LLVM 语言参考手册: 位码是已编译程序的中间表示。 IR - 中间表示代码,...

    glTF2-loader:[UNMAINTAINED] C ++ glTF(仅适用于2.0)加载程序

    测验可以使用BUILD_TESTS CMake变量启用使用googletest框架的测试。 将在您的构建目录的test/子目录中创建一个可执行文件。 CI即将推出。使用该库的项目随时打开请求请求,将您的项目添加到列表中!执照glTF2-loader...

    Makefile.pdf

    第二部分、关于程序的编译和链接...............................................................................................6 第三部分、 Makefile 介绍 ...................................................

    nballerina:生成平台特定的可执行文件的Ballerina编译器后端

    Ballerina 将Ballerina IR转换为LLVM IR。 在Ubuntu 20.04中从源代码构建 先决条件 sudo apt install build-essential llvm-11-dev cmake cargo python3-pip ... 创建JAVA_HOME环境变量并将其指向J

Global site tag (gtag.js) - Google Analytics