1. Hello, World!

我写了一个名为 hello.cpp 的程序,可以用下面的命令编译:

$ g++ -o hello hello.cpp

我可不想每次更改程序都输入这么长的命令,于是我决定建立一个 Makefile 文件,内容如下:

hello: hello.cppg++ -o hello hello.cpp

于是,编译的时候只需要输入 make 就行了!

$ make
$ ./hello
Hello, World!
$

2. Makefile 基本语法

我写了一个新的Makefile文件:

alpha:echo Alpha
beta:echo Beta
gama:echo Gama

看看运行效果:

$ make
echo Alpha
Alpha$ make alpha
echo Alpha
Alpha$ make beta
echo Beta
Beta$ make gama
echo Gama
Gama

通过操作效果,不难看出Makefile的编写规律。这份文件中的alpha、beta、gama称为“规则”,Makefile由若干规则组成。不过,如Makefile文件如此简单的话,那么也就起到批处理程序的作用。接下来我们进一步探讨一下更复杂的语法。

3. 依赖关系描述

接下来我把刚才的程序分成三个文件:main.cpp、hello.hpp、hello.cpp。代码如下:

main.cpp

#include "hello.hpp"int main()
{hello();return 0;
}

hello.hpp

void hello();

hello.cpp

#include <iostream>
using namespace std;void hello()
{cout << "Hello, World!" << endl;
}

Makefile内容如下:

all: main.cpp hello.hpp hello.cppg++ -o hello hello.cpp main.cpp

第一行,标识符 all 是规则名称,冒号后面是依赖项。
第二行,是命令行。可以看出,命令行重复了上一行中的依赖项。我们需要一个机制减少这类代码。

Makefile 有三个非常有用的变量。分别是$@,$^,$<
代表的意义分别是:

  • $@ : 目标文件,
  • $^ : 所有的依赖文件,
  • $< : 第一个依赖文件.

于是,Makefile可以简化为:

hello: main.cpp hello.hpp hello.cppg++ -o $@ $^

注意,all 换成了 hello,因为 $@ 会用规则名称作为目标模块的名称。

更为正式的,Makefile可以按照下面的格式来编写:

hello: main.o hello.og++ -o $@ $^main.o: main.cpp hello.hppg++ -c $<hello.o: hello.cppg++ -c $<

运行make命令,结果如下:

$ make
g++ -c main.cpp
g++ -c hello.cpp
g++ -o hello main.o hello.o$./hello
Hello, World!

Makefile中的规则名,如果执行编译、连接命令的话也是目标名称。make命令能够根据依赖关系,自动确定编译连接的顺序。

既然*.c、*.cpp文件通常编译为*.o文件,上面Makefile文件中冗余信息还是很多,于是有了下面的简单写法。

这里我们学习一个Makefile 的缺省规则
…c.o:
gcc -c $<

这个规则表示所有的 .o 文件都是依赖与相应的.c 文件的.例如hello.o 依赖于hello.cpp。这样Makefile 还可以变为:

hello: main.o hello.og++ -o $@ $^
..c.o:g++ -c $<

执行一下make,结果和上面一样。注意,在make以前,把刚才编译的hello、mian.o、hello.o文件删掉。因为如果不删掉的话,make命令会发现源代码没变化,拒绝编译,并给出"make: ‘hello’ is up to date."这样的提示。

三分钟 Makefile 编写快速入门相关推荐

  1. java给英雄加血,能给小兵加血的英雄你知道吗?三分钟教你快速入门!

    王者荣耀当中有很多英雄,每个英雄都有些自己独特的技能和特点.有的英雄天生自带复活甲,有的英雄天生自带暴击率,有的英雄天生可以给队友加血,今天我们来讲一个更奇葩的英雄,居然开局可以给小兵加血!今天我们就 ...

  2. mongodb 输出数组字段_三分钟 mongodb 开发快速上手

    三分钟 mongodb 开发快速上手 小熊昨天晚上做了一个非常真实的噩梦,有读者朋友催我"怎么又没有发文!让我们等的好辛苦",今天一睁开眼眼看后台留言,特么,居然是真的! 我bil ...

  3. 带您探究云存储的奥秘,三分钟帮您快速了解OSS

    摘要: 快来,带您探究云存储的奥秘,三分钟帮您快速了解OSS. 阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定.可靠.安全.低成本的特点,能够提供十一个九的数据可靠 ...

  4. 三分钟就能快速注册好域名的方法

    在生活中,每个人能会遇到着急的事情.因此着急注册域名偶有发生,如果急需要一个域名去哪里注册?有没有几分钟就能注册好域名的地方?想要快速注册一个好用的域名有什么方法?如果你还不清楚上诉问题就和小聚一起来 ...

  5. sketch android 切图,三分钟教你快速设置Sketch切图方案

    Sketch想必小伙伴们都已经用的挺熟悉的啦,在你的工作中,应该常常碰到各样切图尺寸大小的问题.陈踢缺er曾在设计App项目中也遇到过各种这样的问题,下面我来结合实际操作来分享给大家使用sketch如 ...

  6. Tampermonkey(油猴)脚本编写快速入门

    目录 油猴脚本概述 脚本注释/注解 脚本权限 grant 添加新脚本 自定义网页倒计时 网页浏览离开黑屏保护 微博视频下载助手 华为云工作项列表突出展示工作项 Greasy Fork 发布脚本 油猴脚 ...

  7. 五分钟实现SpringBoot快速入门

    文章目录 一.创建Maven工程 二.添加SpringBoot的起步依赖 三.编写SpringBoot引导类 四.编写Controller 五.测试 六.SpringBoot工程热部署 一.创建Mav ...

  8. 一发入魂!15分钟让你快速入门Python

    文章目录 前言 1 python基本数据类型 2 Python推倒式 2.1 列表推倒式 2.2 字典推倒式 2.3 集合推倒式 2.4 元组推倒式 3 注释 4 运算符 4.1 算数运算符 4.2 ...

  9. 无基础的人如何唱好歌、三分钟让你快速学会唱歌技巧

    无基础的人如何唱好歌?很多同学对于唱歌很感兴趣,但是由于自己在唱歌方面没有什么天赋和基础,常常会感到很苦恼,没有基础该如何唱好歌呢?下面是是一些基本的方法和经验,仅供参考. 1怎样才能唱好歌? 用嗓子 ...

最新文章

  1. Facebook和Google,做不了恋人做仇人
  2. ORACLE查询删除重复记录
  3. 给JavaScript的单个对象定义属性和属性的元数据
  4. Linux_日志管理介绍(一)
  5. 客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美
  6. matlab库存点仿真教程,基于MATLABSimulink库存系统建模与仿真.doc
  7. 无需私钥的pssh的安装使用
  8. 《C语言及程序设计》程序阅读——数组与指针
  9. MATLAB/Simulink搭建电动汽车整车七自由度模型
  10. Datalogic 得利捷推出超级灵活且坚固可靠的PowerScan 9600 系列 庆祝公司成立50周年
  11. 希尔密码加解密(Python)
  12. 华为铁三角作战的道法术,华为铁三角第一人,LTC专家许浩明老师讲授
  13. 使用spark计算IRR(内部收益率)
  14. 怎么做有效沟通技巧员工培训PPT课件?
  15. VFB直接使用TCP发送电子邮件源码
  16. Spinner的用法(转)
  17. 顶配梧桐树金玉满堂增额终身寿险,对抗“资产荒”的高增长神器
  18. 最少拍无纹波计算机控制系统,最少拍无纹波计算机控制系统设计.doc
  19. 177本名著浓缩成了177句话!别等自己做错时才明
  20. 笔记本给手机刷机失败数据怎么恢复

热门文章

  1. 声波的色散和频散曲线
  2. windows下使用OpenGL实现yuv420p转rgb播放视频(三重纹理实现)
  3. silicon EFR32BG22 应用内进行OTA
  4. 【i.MX8 Linux】i.MX8 硬件平台介绍(MCIMX8M-EVK)
  5. 【光纤传感硬件类论文】
  6. Keil C251V557破解
  7. 华为如何不关闭进程_华为怎么关闭多个进程 如何关闭运行程序
  8. MyBatis08:ResultMap 的结果集映射,java编程题面试题
  9. 数字IC设计中的均衡器
  10. Image-Line 的 FL Studio 21 新主题来啊 如何更改 FL Studio 21 中的主题?