• 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等生成二进制发布包。

  • 相关阅读:
    SQL 死锁
    【Redis】存入redis的值,莫名其妙多了很多“u0000”
    for循环里面使用task
    Idea---SpringBoot整合Mybatis问题整理
    到相对应的元素位置。
    npm安装任何包都报错的解决办法
    form表单提交和ajax提交的使用场景和差别
    computed计算属性以及与watch的区别
    了解js的宏任务(macrotask)和微任务(microtask)以及Event-Loop
    async/await,promise的优缺点
  • 原文地址:https://www.cnblogs.com/ahuangliang/p/7190582.html
Copyright © 2020-2023  润新知