三分钟 Makefile 编写快速入门
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 编写快速入门相关推荐
- java给英雄加血,能给小兵加血的英雄你知道吗?三分钟教你快速入门!
王者荣耀当中有很多英雄,每个英雄都有些自己独特的技能和特点.有的英雄天生自带复活甲,有的英雄天生自带暴击率,有的英雄天生可以给队友加血,今天我们来讲一个更奇葩的英雄,居然开局可以给小兵加血!今天我们就 ...
- mongodb 输出数组字段_三分钟 mongodb 开发快速上手
三分钟 mongodb 开发快速上手 小熊昨天晚上做了一个非常真实的噩梦,有读者朋友催我"怎么又没有发文!让我们等的好辛苦",今天一睁开眼眼看后台留言,特么,居然是真的! 我bil ...
- 带您探究云存储的奥秘,三分钟帮您快速了解OSS
摘要: 快来,带您探究云存储的奥秘,三分钟帮您快速了解OSS. 阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定.可靠.安全.低成本的特点,能够提供十一个九的数据可靠 ...
- 三分钟就能快速注册好域名的方法
在生活中,每个人能会遇到着急的事情.因此着急注册域名偶有发生,如果急需要一个域名去哪里注册?有没有几分钟就能注册好域名的地方?想要快速注册一个好用的域名有什么方法?如果你还不清楚上诉问题就和小聚一起来 ...
- sketch android 切图,三分钟教你快速设置Sketch切图方案
Sketch想必小伙伴们都已经用的挺熟悉的啦,在你的工作中,应该常常碰到各样切图尺寸大小的问题.陈踢缺er曾在设计App项目中也遇到过各种这样的问题,下面我来结合实际操作来分享给大家使用sketch如 ...
- Tampermonkey(油猴)脚本编写快速入门
目录 油猴脚本概述 脚本注释/注解 脚本权限 grant 添加新脚本 自定义网页倒计时 网页浏览离开黑屏保护 微博视频下载助手 华为云工作项列表突出展示工作项 Greasy Fork 发布脚本 油猴脚 ...
- 五分钟实现SpringBoot快速入门
文章目录 一.创建Maven工程 二.添加SpringBoot的起步依赖 三.编写SpringBoot引导类 四.编写Controller 五.测试 六.SpringBoot工程热部署 一.创建Mav ...
- 一发入魂!15分钟让你快速入门Python
文章目录 前言 1 python基本数据类型 2 Python推倒式 2.1 列表推倒式 2.2 字典推倒式 2.3 集合推倒式 2.4 元组推倒式 3 注释 4 运算符 4.1 算数运算符 4.2 ...
- 无基础的人如何唱好歌、三分钟让你快速学会唱歌技巧
无基础的人如何唱好歌?很多同学对于唱歌很感兴趣,但是由于自己在唱歌方面没有什么天赋和基础,常常会感到很苦恼,没有基础该如何唱好歌呢?下面是是一些基本的方法和经验,仅供参考. 1怎样才能唱好歌? 用嗓子 ...
最新文章
- Facebook和Google,做不了恋人做仇人
- ORACLE查询删除重复记录
- 给JavaScript的单个对象定义属性和属性的元数据
- Linux_日志管理介绍(一)
- 客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美
- matlab库存点仿真教程,基于MATLABSimulink库存系统建模与仿真.doc
- 无需私钥的pssh的安装使用
- 《C语言及程序设计》程序阅读——数组与指针
- MATLAB/Simulink搭建电动汽车整车七自由度模型
- Datalogic 得利捷推出超级灵活且坚固可靠的PowerScan 9600 系列 庆祝公司成立50周年
- 希尔密码加解密(Python)
- 华为铁三角作战的道法术,华为铁三角第一人,LTC专家许浩明老师讲授
- 使用spark计算IRR(内部收益率)
- 怎么做有效沟通技巧员工培训PPT课件?
- VFB直接使用TCP发送电子邮件源码
- Spinner的用法(转)
- 顶配梧桐树金玉满堂增额终身寿险,对抗“资产荒”的高增长神器
- 最少拍无纹波计算机控制系统,最少拍无纹波计算机控制系统设计.doc
- 177本名著浓缩成了177句话!别等自己做错时才明
- 笔记本给手机刷机失败数据怎么恢复
热门文章
- 声波的色散和频散曲线
- windows下使用OpenGL实现yuv420p转rgb播放视频(三重纹理实现)
- silicon EFR32BG22 应用内进行OTA
- 【i.MX8 Linux】i.MX8 硬件平台介绍(MCIMX8M-EVK)
- 【光纤传感硬件类论文】
- Keil C251V557破解
- 华为如何不关闭进程_华为怎么关闭多个进程 如何关闭运行程序
- MyBatis08:ResultMap 的结果集映射,java编程题面试题
- 数字IC设计中的均衡器
- Image-Line 的 FL Studio 21 新主题来啊 如何更改 FL Studio 21 中的主题?