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. ...
随机推荐
- 获取设备 ID 和名称
获取设备 ID 和名称 .NET Framework 3.5 其他版本 更新:2007 年 11 月 要获取设备的名称,请使用 Dns.GetHostName 属性.通常情况下,默认名称为“P ...
- 在 Docker 中运行 MySQL
首先启用 Windows 10 的容器功能,然后去 Docker 的官网,下载安装包. 跟着安装程序走完流程,Docker 就在 Windows 上愉快的游起来啦~ 设置镜像地址 Docker 在创建 ...
- cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'
<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springfr ...
- sqlserver卸载
- java数组复制===clone()
总结:使用方法原理弄清楚 package com.a; public class gjsopb { public static void main(String[] args) { int a[] = ...
- MySQL 当记录不存在时insert,当记录存在时update(ON DUPLICATE KEY UPDATE, REPLACE语句)
MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法. 第一种:示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语 ...
- selenium中Xpath轴定位方法
1.Xpath轴:轴可定义相对于当前节点的节点集. 使用语法:轴名称::节点名称 例://input[@data-value="SXRYNAME"]/parent::td/foll ...
- lnmp一键安装包,安装多版本php,并开启redis与swoole
安装多版本的php sudo ./install.sh mphp Install ZendGuardLoader for PHP 7.1... unavailable now. Write ZendG ...
- js中的webworker
js中的webworker webworker的作用类似于java的多线程 以独立文件的形式运行webworker index.html <!DOCTYPE html> <html ...
- DRF之注册器响应器分页器
概要 url注册器 响应器 分页器 url注册器 通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下: 第一步:导入 ...