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. ...
随机推荐
- Internet上的网络层
TCP/IP协议栈第三层是网络层,网络层的目的是实现两个系统之间的数据透明传送,具体功能包括寻址和路由选择.连接和建立.保持和终止等. TCP/IP协议给internet上的每台主机和路由分配一个地址 ...
- 数据流重定向和管道命令, grep, tr,sort, wc, cut,split,tee,sleep(shell 02)
主要内容 1.标准输入输出和错误 2.管道命令和 grep, tr,sort, wc, cut,split,tee,sleep 标准输入输出和错误 标准输入(stdin) 是指令数据的输入,代码为0, ...
- sql中case when的简单使用
这是一个很多博客都引用的博客,作者未知,但是我第一次看到的就是这个,所以置顶这个吧, 这里有两个我刚才使用的列子: --查询同一机构的签约数和解约数: select t.sgn_acct_issr_i ...
- java随机数组
import java.util.Random; public class Ccore { public static void main(String[] args) { for(int i=1;i ...
- sublime text3 FTP直接上传
- 24 mysql怎么保证主备一致
Mysql主备的基本原理 在状态1中,客户端直接访问节点A,而节点B只是备库,只是将A的binlog全部同步过来并应用到本地,这样可以保持节点B和节点A的数据是相同的. 当需要切换的时候,就变成状态2 ...
- python学习(十八) 程序打包
18.1 Distutils基础 18.2 打包 18.2.1 建立存档文件 18.2.2 创建Windows安装程序或RPM包 18.3 编译扩展 18.4 使用py2exe创建可执行程序
- c# 各种tips
1.lock 类似于 java中的synchronized,对对象或代码块加上互斥锁. 2.c#中的lambda表达式, ForEach(x => f(n)) 3.c# 中的 something ...
- 初识 Julia
Ubuntu 下安装 Julia 环境 sch01ar@ubuntu:~$ sudo apt install julia 安装完成后打开 Julia 的交互式会话 sch01ar@ubuntu:~$ ...
- PHP函数(二)-不定参数的传递
如果要传递不定数量的参数,需要使用func_get_args()函数来传递 func_num_args()函数用来返回参数的总数 <?php function more_args(){ $arg ...