Cmake VS Autotools

前言

最近的项目中遇到了cmake和autotools的转换的问题,这两个东西以前接触的很少,所以需要对cmake和autotools进行一番系统学习。

Cmake使用

  • wiki关于cmake介绍
  • 官方文档 熟悉某种技术的最好最快的方法还是要通过阅读官方文档:P
  • learning-cmake-a-beginner-s-guide/details
  • CMake 入门实战
  • windows下使用

    Cmake 语法简单介绍

    可以把cmake理解为一种简单的语言,它也有着它的语法和变量。它的语法规则很简单

    1.变量使用${}方式取值

    2.指令(参数1 参数2 。。。)

    3.指令是大小写无关的,参数和变量是大小写敏感的,例如set 和SET 作为指令都是可以的,但是建议全部使用大写的指令。

    4.cmake的语法还是比较灵活且考虑到了各种情况,比如SET(SOURCES_FILES main.c)也可以写成SET(SOURCES_FILES “main.c”),但是假设一个源文件中的文件名是fu nc.c(中间有了空格),这个时候就有必要加上双引号了。

    5.清理工程,跟经典的autotools系列工具一样,make clean可以对构建结果进行清理。

    6.内部构建和外部构建。内部构建就是直接在根目录下面构建(会在工程目录下产生很多文件,使工程看起来比较乱),而使用外部构建比如在工程目录下面创建一个build的目录,然后进入build目录下,进行cmake .. 这样生成的文件都在build目录下。推荐是有外部构建,所以一般的构建命令就是进入 build 目录下面,然后 cmake .. make
    7.注意cmake 是构建项目的过程,是产生Makefile的过程,也就是生成编译指令的过程,这个过程不会包编译的错误。make才是编译和链接的过程,如果你的代码有问题,或者你的编译指令有有问题(比如未包含动态或者静态的lib)这是时候会产生错误。

    8.ADD_LIBRARY()用来生成动态或者静态链接库的。INCLUDE_DIRECTORY()是用来向工程添加多个特定的头文件搜索路径的,路径之间用空格分开,如果路径中包含了空格,可以使用双引号将它括起来。默认的行为是追加到当前的头文件搜索路径的后面。LINK_DIRECTORIES()添加非标准的共享库搜索路径,TARGET_LINK_LIBRARIES(target library1 library2),这个指令可以用来为target添加需要连接的共享库.




    测试代码见github

    autotools使用

  • 使用autotools生成Makefile学习笔记
  • autotools入门

    使用libtool创建库

    使用libtool创建库

    其它

    cmake导致的命令执行问题
    automake 和 autoconf 使用简明教程

    Reference

    https://www.youtube.com/watch?v=gYmgbqGfv-8
    https://stackoverflow.com/questions/7132862/tutorial-for-converting-autotools-to-cmake