前期准备

在真正使用Makefile之前,我们首先先写四个c文件和相应的h文件,分别是fun0.c,fun1.c,fun2.c,fun0.h,fun1.h,fun2.h以及main.c

//fun0.c
#include "fun0.h"
void print0(){printf("hello world 0");
}
//fun0.h
#include <stdio.h>
void print0(void);
//fun1.c
#include "fun1.h"
void print1(){printf("hello world 1");
}
//fun1.h
#include <stdio.h>
void print1(void);
//fun2.c
#include "fun2.h"
void print2(){printf("hello world 2");
}
//fun2.h
#include <stdio.h>
void print2(void);
//main.c
#include "fun0.h"
#include "fun1.h"
#include "fun2.h"int main(){print0();print1();print2();return 1;
}

如此一来我们就有了如下文件。

编写Makefile文件

接着在当前文件夹下创建名为Makefile的文件,代码如下。编写的时候一定要注意!gcc前面是一个TAB,不要输入空格,否则会出错。

这里解释一下,红色框是指目标文件,而蓝色框是指被依赖的文件,也就是说要想生成冒号左边的文件,就需要依赖冒号右边的文件。

编写完成后,在当前文件夹输入make回车即可。如果生成绿色可执行文件表示本次编译成功。输入./main 即可执行。

Makefile文件优化

在上面,我们编写了四个c文件,每个c文件都需要生成相应的.o对象文件,如果一个项目有成百上千个c文件,那么上面这种写法的代码量就非常大了。因此我们需要对代码进行一些修改。

%是通配符,ABC%DEF就是指以ABC开头,以DEF结尾字符串。重新make一下,也能得到刚刚的结果。

Makefile也可以使用变量,我们可以继续修改刚刚Makefile代码。objs是我们定义的变量,它等于 main.o fun0.o fun1.o fun2.o 这条长长的字符串。调用的方法是 ${变量名}。如此一来代码就更加简洁了。

每次make之后都会生成大量的.o文件,我们可以编写相关命令来删除这些中间文件。clear是自定义的命令,make之后,再输入make clear加回车即可清除.o文件。

Makefile基础教程相关推荐

  1. Makefile 入门教程

    1.Makefile简介 Makefile 定义了软件开发过程中,项目工程编译链.链接的方法和规则. 由 IDE 自动生成或者开发者手动书写. Unix(MAC OS.Solaris)和Linux(R ...

  2. Make 命令零基础教程

    Make这个词,英语的意思是"制作".Make命令直接用了这个意思,就是要做出某个文件.比如,要做出文件a.txt,就可以执行下面的命令. $ make a.txt 但是,如果你真 ...

  3. Makefile经典教程(掌握这些足够)

    http://blog.csdn.net/ruglcc/article/details/7814546 拉轰的专栏 少壮不努力 老大徒伤悲 目录视图 摘要视图 订阅 新版极客头条上线,每天一大波干货  ...

  4. Linux编写makefile详细教程

    Linux下编写 makefile 详细教程 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是goo ...

  5. Makefile简单教程

    Makefile简单教程 基础规则 一个简单的 Makefile 文件包含一系列的"规则",其样式如下: 目标(target)-: 依赖(prerequiries)- <ta ...

  6. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  7. [SQL基础教程] 1-5 表的删除和更新

    [SQL基础教程] 1-5 表的删除和更新 表的删除 语法 DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法 ALTER TABLE<表名> ...

  8. python 包用法_Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...

  9. Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0

    Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要 ...

最新文章

  1. mysql 常用操作
  2. 爱创课堂每日一题101天-哪些操作会造成内存泄漏?
  3. python实现DES算法
  4. centeos 6.7 mysql 5.7.12_学习centeos7系统 · cdwanze的博文
  5. JVM调优:使用G1垃圾回收器
  6. Spring-data-redis集成提交数据出现'maxActive'和‘maxWaitMillis’错误
  7. 什么是泛型、为什么要使用以及泛型擦除
  8. php重载,PHP重载基础知识回顾
  9. Java EE,Gradle和集成测试
  10. 在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)...
  11. PRML-系列一之1.6.1
  12. 某 iOS 零点击 0day 漏洞已存在8年之久且正遭利用?苹果称正在调查并将推出补丁...
  13. iphone x php兼容吗,有关iOS11和iPhoneX的适配问题
  14. 【Boost】boost库的随机数的例子
  15. 最具有中国特色的脑筋急转弯
  16. java 回调函数实现_Java实现的回调函数
  17. mdoublem matlab,imhist以及matlab图像矩阵的数据类型
  18. SVN 配置忽略文件
  19. android 开屏广告轮播,抖音-TopView(原生开屏)广告投放介绍
  20. Antv F2双柱状图和折线图的混合写法

热门文章

  1. 管家婆辉煌版7.2版,超级用户密码忘记了
  2. SqlServer处于恢复挂起状态
  3. OCR-Tesseract系列学习——Tesseract for Linux下载与安装
  4. 数位云Android SDK接入指南
  5. 计算机右键管理无法访问指定设备,简单几步解决win10打开任务管理器显示无法访问指定设备方法...
  6. 【电影推荐系统】部署要点总结
  7. android 微信 备份通讯录,微信备份手机通讯录在哪?怎么用微信备份手机通讯录?...
  8. struts中文问题,文章集合
  9. CNAME 和 MX 冲突
  10. JEP解读与尝鲜系列4 - Java 16 中对于 Project Valhalla 的铺垫