CMake入门以及学习笔记
使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake。CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的。现在在国内能找到的相关资料和博客比较多,本人在学习中也看了很多人的博客,比如 CMake学习(一) , CMake语法之流程控制 等。再次感谢这些作者的分享。下边提供一些系统学习的资料。
CMake的官网地址:http://www.cmake.org/
CMake主要的文档《learning_cmake》 《CMake Practice》,这个百度上搜索一下,很容易下载到。
学习CMake之前,借用下 《CMake Practice》中的一段话,如果你的情况符合以下几条就不要浪费时间在CMake上。
1,如果你没有实际的项目需求,那么看到这里就可以停下来了,因为cmake的学习过程就是实践过程,没有实践,读的再多几天后也会忘记。
2,如果你的工程只有几个文件,直接编写Makefile是最好的选择。
3,如果使用的是C/C++/Java之外的语言,请不要使用cmake(至少目前是这样)。
4,如果你使用的语言有非常完备的构建体系,比如java的ant,也不需要学习cmake,虽然有成功的例子,比如QT4.3的csharp绑定qyoto。
5,如果项目已经采用了非常完备的工程管理工具,并且不存在维护问题,没有必要迁移到cmake。
6,如果仅仅使用qt编程,没有必要使用cmake,因为qmake管理Qt工程的专业性和自动化程度比cmake要高很多。
学习CMake之前,最好能找到一个比较简单地例子对照教程看,并且一开始编写一些简单地例子。这样不仅能学得快,也容易建立学习的自信。
下边主要讲三点,也是最常用到的三点。
一、CMake常用命令:
CMakelist中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
CMake中使用"#"表示注释该行代码。
命令:
与其他语言编程语言不同的是,CMake脚本的语法中没有赋值操作,无论是赋值,还是比较、判断操作,都是通过内置命令来完成的,例如"set(),math()等"。所有的内置命令调用形式为:
command(arg1 arg2 arg3 ... argn)
每个参数均以空格,或者分号分割。注:不建议使用分号分割参数.
message():显示一个消息。如message("Hello world");
cmake_minimum_required():需要的最低版本; cmake_minimum_required(version 2.6)
project():项目的名称 如project(hello)
set():Cmake中的赋值操作都是通过这个来做的。如 SET(HELLO_SRCS Hello.c Hello.cpp world.c world.cpp)
add_definitions():设置编译选项;
subdirs:CMake 是以递归的方式工作;处理完当前目录,再去 SUBDIRS 中的目录
add_library :生成一个链接库;
add_executable:添加生成文件;如:ADD_EXECUTABLE (Hello ${HELLO_SRCS})
add_dependencies:包含一个依赖库文件夹;
add_subdirectory:向当前工程添加存放源文件的子目录;
aux_source_directory :不在当前目录下的其他地方的源文件;
include_directories: 指明文件所在路径;
set_target_properties:设置文件为另外一个名字。set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
source_group:当文件都在同一个路径下面使用
二、CMake变量以及变量的引用
CMake中的变量无需声明,并且没有类型概念,这一点类似于python;变量可以认为都是全局的,哪怕在一个宏中定义的变量,也可以在宏的外面被访问到;所有的变量都是一个列表变量,下文在举例时会详细说明这一点;CMake对于变量是大小写敏感的。
在CMake中,有两种引用方式:对于变量值的引用,和直接引用这个变量本身,使用方式分别是:${varName} 和 varName。
三、CMake的宏与函数
同大多数脚本语言一样,CMake中也有宏和函数的概念,关键字分别为"macro"和"function",具体用法如下:
# 宏
macro( [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endmacro()
# 函数
function( [arg1
[arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endfunction()
以简单的求和函数为例,我们来看宏的一个示例:
macro(sum outvar)
set(_args
${ARGN})
set(result 0)
foreach(_var ${_args})
math(EXPR result "${result}+${_var}")
endforeach()
set(${outvar} ${result})
endmacro()
sum(addResult 1 2 3
4 5)
message("Result
is :${addResult}")
上面是一段求和宏定义,我们来解读一下代码:"${ARGN}"是CMake中的一个变量,指代宏中传入的多余参数。因为我们这个宏sum中只定义了一个 参数"outvar",其余需要求和的数字都是不定形式传入的,所以需要先将多余的参数传入一个单独的变量中。当然,在这个示例中,第一行代码显得多余, 因为似乎没必要将额外参数单独放在一个变量中,但是建议这么做。对上面这个宏再进一步加强:如果我们想限制这个宏中传入的参数数目(尽管在这个宏中实际上 是不必要的),那么可以将宏改写一下:
macro(sum outvar)
set(_args
${ARGN})
list(LENGTH _args argLength)
if(NOT argLength LESS 4) # 限制不能超过4个数字
message(FATAL_ERROR "to much args!")
endif()
set(result 0)
foreach(_var ${ARGN})
math(EXPR result "${result}+${_var}")
endforeach()
set(${outvar} ${result})
endmacro()
sum(addResult 1 2 3
4 5)
message("Result
is :${addResult}")
而CMake中的函数("function")与宏唯一的区别就在于,函数不能像宏那样将计算结果传出来(也不是完全不能,只是复杂一些),并且函数中的变量是局部的,而宏中的变量在外面也可以被访问到,请看下例:
macro(macroTest)
set(test1
"aaa")
endmacro()
function(funTest)
set(test2
"bbb")
endfunction()
macroTest()
message("${test1}")
funTest()
message("${test2}")
运行这段代码后,只会打印出一条信息"aaa",由此可以看到宏与函数的区别
CMake入门以及学习笔记的更多相关文章
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- TypeScript 入门教程学习笔记
TypeScript 入门教程学习笔记 1. 数据类型定义 类型 实例 说明 Number let num: number = 1; 基本类型 String let myName: string = ...
- MNIST机器学习入门【学习笔记】
平台信息:PC:ubuntu18.04.i5.anaconda2.cuda9.0.cudnn7.0.5.tensorflow1.10.GTX1060 作者:庄泽彬(欢迎转载,请注明作者) 说明:本文是 ...
- 《Qt Quick 4小时入门》学习笔记4
http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...
- 《Qt Quick 4小时入门》学习笔记3
http://edu.csdn.net/course/detail/1042/14807?auto_start=1 Qt Quick 4小时入门 第八章:Qt Quick中的锚(anchors)布局 ...
- 《Qt Quick 4小时入门》学习笔记2
http://edu.csdn.net/course/detail/1042/14805?auto_start=1 Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍 1. ...
- 《Qt Quick 4小时入门》学习笔记
http://edu.csdn.net/course/detail/1042/14804?auto_start=1 Qt Quick 4小时入门 第五章:Qt Quick里的信号与槽 QML中 ...
- 完整的Django入门指南学习笔记1
转自[https://blog.csdn.net/qq_35554125/article/details/79462885] part 1: 前沿 教程材料一共会被分为七个部分. 此教程将从安装.开发 ...
随机推荐
- Struts2 action的单例与多例
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象.原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面 ...
- 【转】 详解Kafka生产者Producer配置
粘贴一下这个配置,与我自己的程序做对比,看看能不能完善我的异步带代码: ----------------------------------------- 详解Kafka生产者Produce ...
- asp.net core 中的MD5加密
尝试了很长时间,但是一直报core 5 不可用,当时就崩溃了. 但是偶然的机会 我添加了Microsoft.AspNet.Identity 之后.MD5就好用了. 估计是这个报实现了core5下的MD ...
- 前端性能利器——dynatrace ajax edition
因为最近的工作跟性能分析有关系,所以写个小总结. 顺带推荐两个我常用的小工具: 1.文件对比工具beyond compare,非常好用,对比.修改很简单.当然我只是用的试用版本.google一下官网下 ...
- cf558c(bfs)
C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 2.交通聚类 -层次聚类(agnes)Java实现
1.项目背景 在做交通路线分析的时候,客户需要找出车辆的行车规律,我们将车辆每天的行车路线当做一个数据样本,总共有365天或是更多,从这些数据中通过聚类来获得行车路线规律统计分析. 我首先想到是K-m ...
- C#第一次的Hello World
这个Hello World是最基础的,在程序默认生成的using System下,不用自己可以的去写using System. 我们要牢记compling and running和running wi ...
- Java项目相关监控与调优
Linux JVM Tomcat =========Linux =============== 监控 nmon 命令:nmon -s 10 -c 60 -f -m /home -s 10 每10s ...
- Hello 畅连·西瓜 帮助与更新
无感认证很好用,软件不再更新, 感谢每一位朋友的陪伴,谢谢! (2016.12.15) 百度云:点击下载 ------------旧版更新日志------------- Hello 畅连·西瓜 官网: ...
- .Net的要知道的一些事
1.什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式? .Net是微软推出的框架 CLI是公共语言接口(规范) CLR是公共语言 ...