makefile指在目录下叫做Makefile的文件,由make工具进行解释执行。在文件的编译过程中,首先将源代码编译生成中间文件.o,这个阶段只检测语法,如果源文件较多,那么Object File也会较多,此时将这些Object File链接合成一个执行文件的过程会变得比较繁琐。

为了提高编译速度,需要对没有编译过的或者更新了的源文件进行编译,其他的直接链接中间目标文件。当头文件更改了时,我们还需要重新编译引用了更改过的头文件的文件。上面所说的通过make命令和我们编写的makefile就可以完成。

简单来说,makefile就是一个纯手动的IDE,通过手写编译规则和依赖来配合make命令提高编译工作效率。make会先读入所有include的makefile,将各文件中的变量做初始化,分析语法规则,创建依赖关系链,依据此关系链来判定所需要生成的文件。

makefile的语法规则如下:

target ... : prerequisites ...command......

其中的target可以是一个目标文件,也可以是一个可执行文件,还可以是一个label。prerequisites表示target所依赖的文件或者是target(?)。prerequisites的文件或target只要有一个更新了,对应的后面的command就会执行。command就是这个target要执行的shell命令。

举个例子,我们首先写一个main.c:

#include<stdio.h>
#include"foo.h"int main(){printf("Hi \n");sayHey();return 0;
}

接下来我们写一个foo.c:

#include"foo.h"void sayHey(){print("Hey! \n");
}

补上对应的foo.h:

void sayHey();

接下来我们写一个makefile:

hi: main.o foo.occ -o hi main.o foo.omain.o: main.c foo.hcc -c main.cfoo.o: foo.c foo.hcc -c foo.cclean:rm hi main.o foo.o

在该目录下直接输入make就能生成hi可执行文件,如果想要清除掉生成的可执行文件和中间目标文件,只要执行make clean就可以了。

上面代码中冒号后的.c和.h文件就是表示依赖的prerequisites。我们可以发现main.o foo.o字符串重复了两次,这种重复多次的代码块可以进行简化,类似C语言中的变量,在makefile中的写法如下:

object = main.o foo.o

使用这个变量的语法是$(objects),使用变量语法后makefile就会变成下面的样子:

objects=main.o foo.ohi: $(objects)cc -o hi $(objects)main.o: main.c foo.hcc -c main.cfoo.o: foo.c foo.hcc -c foo.cclean:rm hi $(objects)

makefile具有自动推导的能力,比如target如果是一个.o文件,那么makefile就会自动将.c加入prerequisites,而不用手动写,并且cc -c XXX.c 也会被推导出,利用了自动推导的makefile如下:

objects = main.o foo.ohi: $(objects)cc -o hi $(objects)main.o: foo.h
foo.o:clean:rm hi $(objects)

待补充 make中通配符

cmake

由于GNU的make和其他工具,比如微软的nmake和BSD的pmake的makefile语法规则标准有所不同,因此如果想为多个平台和工具编写可编译的makefile需要写多份makefile文件。

为了应对这样重复繁琐的工作,cmake出现了。

我们可以编写CMakeList.txt这样的文件来定制编译流程,cmake会将其转换成平台和工具相应的makefile文件和对应的工程文件(比如Xcode工程和Visual Studio工程)。我们所熟悉的LLVM就是用的cmake,源码各个目录下都有对应的CMakeList.txt文件。

c++ makefile和cmake相关推荐

  1. Makefile和Cmake的联系与区别

    CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要 ...

  2. 第15章 Linux的Makefile与Cmake编程

    文章目录 文档配套视频讲解链接地址 第15章 Makefile与Cmake编程 15.1 Makefile 1. 什么是Makefile 2. Makefile 介绍 3. Makefile的规则 4 ...

  3. make、makefile和cmake简单介绍

    make.makefile和cmake的关系 cmake安装 cmake简单示例 make.makefile和cmake的关系 提到make,makefile就不得不提GNU,GNU是"GN ...

  4. 【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )

    文章目录 一.在 Android Studio 中创建 Native C++ 工程 二.C/C++ 源码编译过程 三.Makefile 工具 四.CMake 引入 该系列博客的应用场景是 Androi ...

  5. c语言项目为什么要build?(gcc、makefile、cmake(qmake)、CMakeLists.txt)(qmake、cmake、qbs区别解析)(qmake还是cmake,mingw作用)

    搞不太懂gcc和cmake(qmake)等的区别 1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器, 它可以编译很多种编程语言(括C.C++. ...

  6. gcc/g++/makefile/easymake/cmake/xmake/nmake ...

    最简单的Makefile,但是还是大程序少不了makefile工具 #CC=arm-linux-gnueabihf- CC= target:     $(CC)gcc -o algo_main alg ...

  7. slitaz c语言开发环境,makefile和cmake的简单使用

    这是我自己写的一份makefile文件,最简单的一个 BSoftInst: BSoftInst.cpp ReadXML.cpp main.cpp ireg.cpp ntreg.cpp Software ...

  8. Ubuntu学习日记--Lesson10:gcc、make、makefile、cmake、cmakelists区别

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

  9. Android.mk、Makefile、Cmake打印log

    1.Android.mk$(info "--------------before------------------") TEST_MODULE_SUPPORT := yes // ...

  10. cmake,CMakeLists.txt,make,makefile的关系

    cmake的作用:生成makefile的工具.读入源文件之后,自动生成makefile CMakeLists.txt的作用:告诉cmake,如何生成makefile makefile的作用:设置编译规 ...

最新文章

  1. 突破微信小程序五层层级限制的解决方案
  2. 综述:基于点云的自动驾驶3D目标检测和分类方法
  3. Dockerfile 最佳实践
  4. linux导出并追加到文件,linux – 如何将awk结果输出到文件
  5. 手电筒android studio,Android Studio:手电筒关闭时崩溃
  6. linux下lua开发环境安装
  7. 交叉编译mysql客户端libmysql
  8. MySQLWorkbench注释
  9. redhat7.0配置网卡
  10. IHS Infonetics:网络运营商进军SDN
  11. 克隆CentOS设置网络连接
  12. matlab中的语言,把c语言变成matlab语言,可以在matlab中运行。
  13. Day 35 年会抽奖 + 抄送列表
  14. 40163 php,微信支付授权获取 openId {quot;errcodequot;:40163,quot;errmsgquot;:quot;code been used, hints:...
  15. 常用大数据核心技术有哪些?
  16. N款在线图片处理工具,让你的效率翻倍
  17. java对接快递单号查询自动识别api接口,调用代码示例
  18. idea报错 Result Maps collection does not contain value for com.
  19. vue+pdf.js 印章签署完后鼠标滑过显示签章信息
  20. vue uniapp通用省市下拉选择器组件 布局样式可灵活根据ui变更 (区域 可根据数组嵌套的格式继续往下模仿即可)

热门文章

  1. pyecharts制作交互式数据展示地图
  2. 计算机网络实验视频word,(完整word版)《计算机网络与通信》实验.docx
  3. Flutter之EdgeInsetsGeometry简析
  4. Apache Flink 进阶(一):Runtime 核心机制剖析
  5. 月薪30K大佬源码阅读的经验总结,干货不容错过
  6. 仅能帮的(非技术分享)
  7. mysql 手机归属地_盒子 - 手机归属地 MySql 数据
  8. java 带参数转发_Nginx 根据URL带的参数转发的实现
  9. mysql动态变量查询_使用php变量创建动态mysql查询
  10. linux lsnrctl命令不存在,linux – oracle lsnrctl TNS-12545:连接失败,因为目标主机或对象不存在...