前面有提到使用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使用技巧的更多相关文章

  1. CMake使用技巧集

    1.注意CMake不允许出现相同的目标名称,即使是不同的目录下的CMakeLists.txt 2.将头文件搜索路径插入到其它的前面: include_directories(BEFORE /tmp) ...

  2. CMake和静态库顺序

    目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些“-l”链 ...

  3. Vim配置及使用技巧

    要说Linux下比较好用的文本编辑器,我推荐vim(当然很多人都用emacs,可我没用过),用vim也有一年左右,有些心得体会想与诸位分享.在我的学习过程中,借鉴了不少优秀的博客,其中有csdn大神n ...

  4. Qt Creator下应用CMake项目调试mex文件

    网上可以找到很多应用Visual Studio编写.编译mex文件,并与MATLAB联合调试的文章.但这只限于Win平台,网上许多源码都是.mexa64的文件,它们的作者是怎么调试的呢?这里我介绍一下 ...

  5. 【转】VC++10(VS2010)IDE各种使用技巧

    原文网址:http://www.cnblogs.com/sunrisezhang/articles/2802397.html 一个好的coder,他首先必须是一个熟练工.对于C++程序员来说,只有掌握 ...

  6. 在linux下使用CMake构建应用程序

    本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...

  7. <<Modern CMake>> 翻译 2. CMake 基础

    <<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...

  8. CMake中的两种变量(Variable types in CMake)

    在CMake中存在两种变量:normal variables and cache varialbes .正常变量就像是脚本内部变量,相当于程序设计中定义的局部变量那样.而CMakeLists.txt相 ...

  9. 使用 cmake 来搭建跨平台的应用程序框架:C语言版本

    目录 一.前言 二.示例代码说明 1. 功能描述 2. 文件结构 3. cmake 构建步骤 4. Utils 目录说明 5. Application 目录说明 三.Linux 系统下操作步骤 1. ...

随机推荐

  1. 获取设备 ID 和名称

    获取设备 ID 和名称 .NET Framework 3.5   其他版本   更新:2007 年 11 月 要获取设备的名称,请使用 Dns.GetHostName 属性.通常情况下,默认名称为“P ...

  2. 在 Docker 中运行 MySQL

    首先启用 Windows 10 的容器功能,然后去 Docker 的官网,下载安装包. 跟着安装程序走完流程,Docker 就在 Windows 上愉快的游起来啦~ 设置镜像地址 Docker 在创建 ...

  3. 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 ...

  4. sqlserver卸载

  5. java数组复制===clone()

    总结:使用方法原理弄清楚 package com.a; public class gjsopb { public static void main(String[] args) { int a[] = ...

  6. MySQL 当记录不存在时insert,当记录存在时update(ON DUPLICATE KEY UPDATE, REPLACE语句)

    MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法. 第一种:示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语 ...

  7. selenium中Xpath轴定位方法

    1.Xpath轴:轴可定义相对于当前节点的节点集. 使用语法:轴名称::节点名称 例://input[@data-value="SXRYNAME"]/parent::td/foll ...

  8. lnmp一键安装包,安装多版本php,并开启redis与swoole

    安装多版本的php sudo ./install.sh mphp Install ZendGuardLoader for PHP 7.1... unavailable now. Write ZendG ...

  9. js中的webworker

    js中的webworker webworker的作用类似于java的多线程 以独立文件的形式运行webworker index.html <!DOCTYPE html> <html ...

  10. DRF之注册器响应器分页器

    概要 url注册器 响应器 分页器 url注册器 通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下: 第一步:导入 ...