除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,makefile由此而生,在编译时候直接输入make便会按照makefile里面的规则编译源代码。Android的源代码就是通过makefile管理的。

make的工作原理

make通过makefile得到编译规则,从而编译源文件

makefile是以一个文本形式的脚本告诉make编译器如何以及怎么编译源代码,里面包含了编译规则

makefile规则遵循以下通用格式

target:dependency [dependency[···]]
command
command
[···]

每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止

makefile的使用

  • makefile的简单使用

    makefile的文件名必须为makefile或者Makefile

    如果要用其他名称,使用make -f filename

    编写makefile文件如下所示,便可以通过make命令编译test.c文件了
start:
gcc -o test test.c
  • 进一步使用makefile
start:test.o
gcc -o test test.o
test.o:
gcc -o test.o -c test.c

说明:target start后面的test.o代表其下的command依赖与test.o这个target。所以make先执行了test.o这个target下的command,如果存在test.o,那么makefile会去查看.c文件的修改时间,再决定编不编译.c文件

  • makefile完善
start:test.o
gcc -o test test.o
test.o:
gcc -o test.o -c test.c
clean:
rm -f test.o

说明:增加clean标签,其后面的指令会在输入make clean时候执行

  • 在makefile中执行shell命令
start:test.o
gcc -o test test.o
@echo '----------ok----------'
test.o:
gcc -o test.o -c test.c
clean:
rm -f test.o
  • 简化makefile

    为了简化编辑和维护makefile,可以在makefile中使用变量
varname=some_text

把变量用括号括起来,前面加$就可以引用该变量的值

$(varname)

按照惯例makefile的变量都是大写(只是习惯而已,不是必须的)

CC=gcc
SRCS=test.c
OBJS=test.o
EXEC=test start:test.o
$(CC) -o $(EXEC) $(OBJS)
@echo '----------ok----------'
$(OBJS):
$(CC) -o $(OBJS) -c $(SRCS)
clean:
rm -f $(OBJS)

OBJS可以简化为以下形式,相当于把.c替换为.o

OBJS=$(SRCS:.c=.o)
  • makefile完整版
.SUFFIXES:.c .o

CC=gcc
SRCS=test.c
OBJS=$(SRCS:.c=.o)
EXEC=test start:test.o
$(CC) -o $(EXEC) $(OBJS)
@echo '----------ok----------'
.c.o:
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS)

模式规则

.SUFFIXES:.c .o

表示任何x.c文件与x.o关联,make定义了一条规则,任何x.o文件都从 x.c编译而来

.c.o

make定义了一些有用的预定义变量

变量名 含 义
$@ 规则的目标所对应的文件名
$< 规则中的第一个相关文件名
  • makefile同时编译多个源文件
.SUFFIXES:.c .o

CC=gcc
SRCS=test.c \
a.c OBJS=$(SRCS:.c=.o)
EXEC=test start:test.o
$(CC) -o $(EXEC) $(OBJS)
@echo '----------ok----------'
.c.o:
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS)

常见的make出错信息

  • No rule to make target ‘target’.Stop

    makefile中没有包含创建指定target所需要的规则,而且也没有默认规则可用

  • ‘target’ is up to date

    指定的target相关文件没有变化

  • command:Command not found

    make找不到命令,通常是因为命令被拼写错误或者不在$PATH路径下

C学习笔记-makefile的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

  3. Linux 编程学习笔记----动笔makefile档

    Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...

  4. <转>Windows平台下Makefile学习笔记(二)

    本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...

  5. Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)

    0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...

  6. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  7. 转:openwrt中luci学习笔记

    原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发         ...

  8. android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)

    引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...

  9. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

随机推荐

  1. Java-JDBCUtil工具类

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  2. BZOJ 2243: [SDOI2011]染色 (树剖+线段树)

    树链剖分后两个区间合并的时候就判一下相交颜色是否相同来算颜色段数就行了. CODE #include <vector> #include <queue> #include &l ...

  3. maven项目pom.xml中parent标签的使用(转)

    原文地址:https://blog.csdn.net/qq_41254677/article/details/81011681 使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom. ...

  4. [Javascirpt] What’s new in JavaScript (Google I/O ’19)

    Private variable in class: class Counter { #count = 0; // cannot be access publicly get value () { r ...

  5. 浏览器表单自动填充默认样式 - autofill问题解决

    这不知道是个什么神仙网站,解决办法写的这么清楚,页面有这么让人舒服 https://lhajh.github.io/css/chrome/2018/04/17/The-chrome-browser-f ...

  6. canvas addHitRegion()

    CanvasRenderingContext2D.addHitRegion() 是 Canvas 2D API 给位图添加点击区域的方法. 但是 mobile 都不兼容

  7. 阿sa

    # jieba库概述 .jieba是优秀的中文分词第三方库.需要额外安装. pip install jieba # jieba库三种分词模式 精确模式:把文本精确的切分开,不存在冗余单词. 全模式:把 ...

  8. Fire Game (FZU 2150)(BFS)

    题解:一开始想错了,以为只要烧完就是那个答案,但是这不是最优的结果,需要每两个点都bfs一遍,找到如果能够全部烧完,找到花费时间最小的,如果不能return -1.在bfs的时候,记录答案的方法参考了 ...

  9. Jmeter(六)关联之XPath提取器

    如果请求返回的消息为xml或html格式的,可以用XPath提取器来提取需要的数据 以http://www.weather.com.cn/为例: 先新建一个HTTP请求GetCityURL,获取城市天 ...

  10. DOM对象属性

    事件  onmouseover 鼠标以上事件  onmouseout    鼠标离开事件  onclock 鼠标点击事件  onfocus 获取焦点 onblur 失去焦点 oninput  输入事件 ...