Cmake01篇:make工具和Cmake工具的产生原因——Makefile和Cmake的联系与区别

博文01:https://blog.csdn.net/weixin_42491857/article/details/80741060

一、make工具为什么产生?cmake工具又是如何产生的?

下面我们来了解这段历史:

写程序大体步骤为:
1.用编辑器编写源代码,如.c文件。
2.用编译器编译代码生成目标文件,如.o。
3.用链接器连接目标代码生成可执行文件,如.exe。
但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。
对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。所以在编程的世界里没有捷径可走,还是要脚踏实地的。
所以流程如下:
在这里插入图片描述

总结:
(1)cmake工具用来编译CMakeLists.txt文件
转化为make所需要的makefile文件
(2)make工具用来编译makefile文件

原因2:
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object)).它的作用和qt的qmake是相似的。

C/C++程序员肯定离不开Makefile和Cmake,因为如果对这两个工具不熟悉,那么你就不是一个合格的C/C++程序员。本文对Makefile和Cmake,及它们的使用进行了详细的介绍,本文的目录如下:

二、对以下知识有兴趣的百度,或者查资料进行学习

一、Makefile详解

1.1 Makefile语法
1.2 Makefile示例

二、Cmake详解

2.1 Cmake语法
2.2 Cmake示例

个工程都可以完全自动化编译。而且Makefile 可以有效的减少编译和连接的程序,只编译和连接那些修改的文件。

1.1 Makefile语法

1.1.1
Makefile包含了五个重要的东西:显示规则、隐晦规则、变量定义、文件指示和注释。
1. 显示规则:显示规则说明了,如何生成一个或多个目标。这是由Makefile指出要生成的文件和文件依赖的文件。
2. 隐晦规则:基于Makefile的自动推导功能
3. 变量的定义:一般是字符串
4. 文件指示:一般是在Makefile中引用另外一个makefile文件;根据某些规则指定Makefile中有效的部分;多行
5. 注释:#指示注释

  Makefile有三个非常重要的变量:$@、$^、$#,它们的含义如下:
      $@    ---目标文件
      $^      ---所有依赖文件
      $<      ---第一个依赖文件
      .PHONY  ---伪目标文件

  Makefile的执行过程如下:

      1. 在当前目录下寻找Makefile或makefile。
      2. 找到第一个文件中的第一个目标文件,和目标文件依赖的.o文件。
      3. 如果.o文件不存在,或是后面.o文件比target文件更新,那么它就会执行后面的语句来生成这个文件。
      4. 最后makefile会根据.o文件依赖的.h和.c文件生成.o文件。

1.1.2

  注意:
       1. clean不要放在target前面。
       2. -rm edit  $(objects)  忽略某些文件的问题。
       3. Makefile中的命令,必须以[Tab]键分割。文件之间最好使用空格分割。
       4. -I 或 --include-dir 参数,那么make就会在这些目录下去寻找。
       5. -L 相当于load lib dir, -lfb303  相当于libfb303.so

1.1.3 g++编译命令:
1. -g 相当于debug
2. -Wall 相当于忽略warnning
3. -O1~3 相当于优化级别
4. -lpthread多线程
5. -j8 多线程编译
6. -D相当于宏定义,-D_YUQIANG,那么#ifdef _YUQIANG就是True的。

二、CMake详解

CMake是一个夸平台的安装(编译)工具,可以简单的语句描述所有平台的安装(编译过程)。它能输出各种各样的makefile或者project文件,能测试编译器所支持的c++特性,类似UNIX下的automake。

2.1 Cmake语法

参考文献:

  1. Linux Makefile教程: http://blog.csdn.net/liang13664759/article/details/1771246
  2. CMake 学习二: http://blog.sina.com.cn/s/blog_53b7ddf00101mjp5.html
  3. CMake基本用法: http://blog.sina.com.cn/s/blog_68409a2801019bm7.html

三、gcc编译器——扩展阅读

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4.所以出现了make工具
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式——通过调用makefile文件中用户指定的命令来进行编译和链接的。

5.makefile是什么? 一个比喻:
简单的说makefile就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

8.所以这时候就出现了Cmake这个工具:
cmake可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

9.可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

10.到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

12.cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。
13.make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值