一、简介

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序(简单将:管理工程的文件,决定先编译哪些文件,编译顺序)。

二、编写规则:

目标1:目标依赖  然后回车+tab键

命令;

目标2:目标依赖  然后回车+tab键

命令;

...

目标n:目标依赖  然后回车+tab键

命令;

注意:命令必须是tab键开头的。

三、Makefile演进

1、一个项目有main.c/a.c/a.h/b.c/b.h五个文件;main.c包含a.h和b.h并使用相关函数;然后建立一个新的Makefile文件,内容如下:

main:a.o b.o

gcc -o main a.o b.o

a.o:a.c

gcc -c a.c -o a.o

b.o:b.c

gcc -c b.c -o b.o

2、Makefile升级1

采用makefile变量:想用就用,没有类型,不需要定义(引用变量使用$(obj)来包含更多.o文件)

方法:obj:=a.o b.o

那么上面的Makefile程序升级如下:

obj:=a.o b.o

main:$(obj)

gcc -o main a.o b.o

a.o:a.c

gcc -c a.c -o a.o

b.o:b.c

gcc -c b.c -o b.o

3、Makefile升级2

经过以上两个makefile的编译,项目执行是成功的,但是如果main.c需要引用更多文件中的函数时,是否要填写那么多的编译命令吗?显然这个方法不可取。

改进:makefile特殊变量和自动推导功能

知识点说明:

$@  代表目标名,

$^  代表依赖文件

%  代表任意字符

%.o  代表任意.o文件

%.c  代表任意.c文件

以上Makefile升级如下:

obj:=a.o b.o

main:$(obj)

gcc -o main $(obj)

%.o:%c      #注释:模式通配,自动将.c文件编译成.o文件

gcc -o $@ -c $^    #注释:通配符

clean:

rm -rf *.o main

4、Makefile升级3

exe=main      #注释:最后的编译结果名字

obj:=main.o a.o b.o c.o   #注释:依赖文件

all:$(obj)

gcc -o $(exe) $(obj)

%.o:%.c

gcc -c $^ -o $@

clean:

rm -rf $(obj) $(exe)

以上程序看似没有什么问题的,但是clean有点瑕疵,要是也有一个文件叫clean那怎么办?如果make clean就没办法执行这条命令。

5、Makefile升级4

使用伪目标.PHONY来解决clean瑕疵问题,升级Makefile如下:

exe:=main

obj:=main.o a.o b.o c.o

all:$(obj)

gcc -o $(exe) $(obj)

%.o:%.c

gcc -c $^ -o $@

.PHONY:clean     #注释:声明clean是伪目标

clean:

rm -rf $(obj) $(exe)

注释#.PHONY:clean声明伪目标,避免当前目录存在名字为clean文件的时候命令不能执行的情况

6、Makefile升级5

有时使用的编译器可能是g++、gcc甚至是arm-linux-gcc。为了方便统一管理,最好开头定义一个变量来代表编辑器,然后在gcc命令上变成$(CC):

Makefile升级如下:

CC:=gcc    #注释:定义一个变量,表示当前编辑器为gcc

exe:=main

obj:=main.o a.o b.o c.o

all:$(obj)

$(CC) -o $(exe) $(obj)

%.o:%.c

$(CC) -c $^ -o $@

.PHONY:clean

clean:

rm -rf $(obj) $(exe)

基本上现在的Makefie可以编辑很多普通的程序了。秩序要对Makefile的文件名适当稍加修改即可。如果在比较大型的程序里面写Makefile会相对知识点多一点,比如添加静态库、动态库、线程等等;后续再做升级。

推荐一本书:GNU make中文手册(翻译整理:徐海兵)

linux makefile教程,Makefile简单入门教程相关推荐

  1. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  2. 大白菜linux系统安装步骤,GRUB简单入门教程

    一.什么是多重操作系统引导管理器,什么是GRUB: 1.什么是多重操作系统引导管理器及工作原理: 系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦 ...

  3. linux c++编程教程,Linux下的C++编程入门教程.ppt

    <Linux下的C++编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C++编程入门教程.ppt(14页珍藏版)>请在人人文库网上搜索. 1.Linux下 ...

  4. linux下的c 编程入门教程,Linux下的C编程入门教程.ppt

    <Linux下的C编程入门教程.ppt>由会员分享,可在线阅读,更多相关<Linux下的C编程入门教程.ppt(14页珍藏版)>请在装配图网上搜索. 1.Linux下c+编程, ...

  5. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

  6. uni-ui简单入门教程 - 如何用HBuilderX为uni-app项目启用uni-ui扩展组件?

    须知 uni-app是一个前端框架 简单来说,uni-app的组件,类似HTML的标签,例如a转navigation.span转text等 uni-app的组件包括 基础组件 (自带免安装) + 扩展 ...

  7. numpy基础篇-简单入门教程4

    numpy基础篇-简单入门教程4 np.set_printoptions(precision=3),只显示小数点后三位 np.random.seed(100)rand_arr = np.random. ...

  8. Proteus简单入门教程以及使用Proteus仿真STM32F103单片机和Arduino单片机

    工欲善其事必先利其器,有条件的朋友直接使用开发板学习即可,但有时候手边没有实物开发板可以用,那么可以借助一些仿真软件运行我们的程序,Proteus算是使用的比较多的一种仿真软件,我们使用它来做STM3 ...

  9. emacs 自带的简单入门教程

    emacs 自带的教程是 英文版和繁体中文版,下面的内容是利用在线繁体转简单工具生成 有些地方翻译的不精准,凑和看 在emacs 中按下 Ctrl-h t 或者F1 t即可打开自带的此文档 原文:em ...

  10. Docker教程(一) Docker入门教程

    Docker教程(一) Docker入门教程 本文链接:https://blog.csdn.net/yuan_xw/article/details/51935278 Docker教程(一) Docke ...

最新文章

  1. Java中的作用域有哪些
  2. sqoop同步hdfs与mysql端口_使用Sqoop将数据在HDFS与MySQL互导
  3. SimpleRAR-攻防世界-Misc(图文详解),文件块和子块,图片的隐写二维码
  4. 如何发表顶级期刊论文
  5. BUUCTF的Web真题学习整理(一)
  6. C语言使用1到9求出所有k个数字的所有组合的算法(附完整源码)
  7. boolean类型_JS核心理论之《数据类型、类型转换、深浅拷贝与参数传递》
  8. Swift之旅--数据类型
  9. vba上传指定文件ftp服务器
  10. python标准库 对socket二次封装_Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服...
  11. Python 变量赋值
  12. Open3d之点云平面分割
  13. ArcGIS 定义坐标系
  14. DMSP/OLS夜间灯光数据
  15. 福建省2020年计算机学业水平考试时间,2020学业水平考试时间表
  16. Shawn邀您共读《WebGL编程指南》| GLSL ES篇
  17. docker版MySQL经常性崩溃_mysql docker容器经常崩溃
  18. 浅谈几个“返利网”----所谓的网购省钱利器
  19. 2020移动apn接入点哪个快_最新联通上网卡APN的设置方法
  20. 用计算机唱歌 丑八怪乐谱,《成都》计算器谱子 抖音计算器按出的音乐乐谱大全...

热门文章

  1. android 微信小程序 唤起app,Android 微信小程序打不开app方案解决
  2. win10默认壁纸_小白个人系统安装美化(二)win10系统美化设置篇
  3. 科大学长对数学系学弟学妹的忠告
  4. HeadFirst设计模式学习笔记
  5. DB9接口详解---DB9引脚在 UART,CAN,RS485中的定义
  6. 常用DB9外设接口定义
  7. SQLserver 2005 安装文档
  8. ios13.7 iPhone/iPad Location-cleaned 驱动下载
  9. 程序员「在知乎装逼被怼」,决定用『面试』证明自己
  10. cocos2d-x 2.2 CocoStudio动画和界面编辑器按钮控制以及场景编辑器使用