CMake使用技巧
前面有提到使用CMake。很多朋友提到也用过一下,没感觉它有什么好用,不知道怎么用之类。
我必要来说明一下。
CMake的语法比较差,不是很优美,不是它不能用一个更好的语法,而是有一个关键优势:简单。
1.CMake当前这种仿C函数的语法基本上没有学习的门阶,无论是否理解CMake都可以读懂。
2.当前CMAKE不能写构建函数,if语句也比较难看,其实强烈传递了,你不应该这么写的,构建脚本不应这么复杂的信号。
在CMake的文档中并没有说过,但我认为,CMake的设计思路中是包括了:让容易的事情简单化,困难的事情可以做。
让每个项目都需要做一遍的事情变得很简单,比如添加多个编译目标,它就非常简单。特别是可执行程序+库这种结构
就更简单了。
但它可以定制一些比较复杂,甚至困难的需求,比如使用多个指定framework,目标文件有不同的名字等等,但语法就不是
那么优美,看起来像是打补丁的样子。
所以另一方面它的理念中约定优于配置的,需要配置的部分会比较难看。
适合的它约定的C++项目是什么样的呢?
项目的构建结果应该是可执行、动态库、静态库和一般文件。如果需要生成内容或打包,就需要定制目标,会比较难看了。
C++编译和连接选项应使用同一套,为每个目标定制,要使用target_xxx命令,会比较难看。
预编译符号,应使用config.h,使用configure_file这条命令生成
注意CMake虽然是生成其它IDE和构建脚本,但它的目标是构建,而不是使用,所以它生成的VS 工程并不美观。如果是为了
生成实用的工程文件,建议使用premake5。它可以从一个脚本中生成vs2008-2017各版本的工程文件。
CMake对库有一个非常好的定义,它可以定义库公开和私有的部分,同时也递归引用,即如果a->b->c这个结构,a只需要说明
引入b,不需要说明也依赖于c。这种情况与Linux的so相同,但与exe文件完全不一致,但可以大大简化程序的配置。
比如整个项目结构是app1, app2, app3, app4 -> platformlib -> utils1, utils2, utils3等等,一般来说app1,app2,app3都是需要连接
utils1/2/3,但在cmake中,只需要说明连接platformlib,cmake会帮助处理对utils1/2/3的连接关系。
对于第三方库,CMake有两种方案,全局性的,可以直接加在includes/definitions/librarys中,直接向所有目标引入。只有部分目标
使用或者更优雅的方式。CMAKE提供了特别的目标支持,IMPORT类型,可以为第三方库构建一个目标,把它统一放到整个构建树的节点中
特别是它可以定义INTERFACE_XXX属性,这样第三方库的包含目录,库文件就只需要声明一次。这就为前文提到的第三方库管理提供了基础。
对于非常常用的第三方库,例如boost,可以通过find_packages引入,包括全局和预定义的import目标,也可能通过BOOST_ROOT变量指定
使用哪个目录下的boost库。
对于部署部分,CMake主要按标准unix程序的方式提供make install选项,在windows下也可以使用,但并不适合二进制发布。但可以简单
提供一个dist前缀目录,安装到这个目录下,再打包成二进制发布。或者自定义一个目标,使用rpm/deb/nsis等生成二进制发布包。
CMake使用技巧的更多相关文章
- CMake使用技巧集
1.注意CMake不允许出现相同的目标名称,即使是不同的目录下的CMakeLists.txt 2.将头文件搜索路径插入到其它的前面: include_directories(BEFORE /tmp) ...
- CMake和静态库顺序
目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些“-l”链 ...
- Vim配置及使用技巧
要说Linux下比较好用的文本编辑器,我推荐vim(当然很多人都用emacs,可我没用过),用vim也有一年左右,有些心得体会想与诸位分享.在我的学习过程中,借鉴了不少优秀的博客,其中有csdn大神n ...
- Qt Creator下应用CMake项目调试mex文件
网上可以找到很多应用Visual Studio编写.编译mex文件,并与MATLAB联合调试的文章.但这只限于Win平台,网上许多源码都是.mexa64的文件,它们的作者是怎么调试的呢?这里我介绍一下 ...
- 【转】VC++10(VS2010)IDE各种使用技巧
原文网址:http://www.cnblogs.com/sunrisezhang/articles/2802397.html 一个好的coder,他首先必须是一个熟练工.对于C++程序员来说,只有掌握 ...
- 在linux下使用CMake构建应用程序
本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...
- <<Modern CMake>> 翻译 2. CMake 基础
<<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...
- CMake中的两种变量(Variable types in CMake)
在CMake中存在两种变量:normal variables and cache varialbes .正常变量就像是脚本内部变量,相当于程序设计中定义的局部变量那样.而CMakeLists.txt相 ...
- 使用 cmake 来搭建跨平台的应用程序框架:C语言版本
目录 一.前言 二.示例代码说明 1. 功能描述 2. 文件结构 3. cmake 构建步骤 4. Utils 目录说明 5. Application 目录说明 三.Linux 系统下操作步骤 1. ...
随机推荐
- .net中webconfig自定义配置
在configuration节点,也就是文件的根节点下,增加如下节点 <appSettings> <!--<add key="propPath" value ...
- 复制书稿(book) (二分,贪心+dp)
复制书稿(book) 时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 1[提交][状态][讨论版][命题人:quanxing] 题目描述 现在要把m本有顺序的书分给k个人复制( ...
- AngularJS:Select
ylbtech-AngularJS:Select 1.返回顶部 1. AngularJS Select(选择框) AngularJS 可以使用数组或对象创建一个下拉列表选项. 使用 ng-option ...
- mysql流程控制
一 流程控制 delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT ...
- Python中常见的异常处理
异常和错误 part1:程序中难免出现错误,而错误分成两种 1. 语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范一 if # 语法错误示范二 d ...
- RAD 10 蓝牙
http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Bluetooth.TBluetoothLEManager.StartDiscov ...
- delphi c++builder 判断工程类型 超级系统变量
d:\program files (x86)\embarcadero\studio\16.0\SOURCE\RTL\SYS\SysInit.pas ModuleIsLib: Boolean; ...
- hadoop 小知识点
------------------------------------------- 配置hadoop的最小blocksize,必须是512的倍数. [hdfs-site.xml] dfs.name ...
- c# 通过dllimport 调用c 动态链接库
https://blog.csdn.net/zhunju0089/article/details/80906501 这篇文件很详细 讲述了如何创建c 动态链接库项目 有一些注意的地方 不做介绍 下面是 ...
- mysql之约束以及修改数据表
数据约束的分类: ———————————————————————————————————————————————————— 外键约束的要求解析: //在my文件中的这句话代表着搜索引擎,如果不是的就需 ...