除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,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. JS转换/Date(-28800000)/格式

    去除/Date() if (value.includes('/Date')) { var re = /-?\d+/; value = re.exec(value); value = new Date( ...

  2. npoi 导出

    npoi 导出 public void Output(DataTable table, string SheetName, string reportName) { string result = s ...

  3. super 和 this 的区别

    一 this和super关键字区别 1.子类的构造函数如果要引用super的话,必须把super放在函数的首位.2.super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)3.t ...

  4. MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

    dbcp下载 传送门 Commons Pool下载 传送门 Commons log下载 传送门 MySQL_(Java)[事物操作]使用JDBC模拟银行转账向数据库发起修改请求 传送门 MySQL_( ...

  5. [BZOJ2730]:[HNOI2012]矿场搭建(塔尖)

    题目传送门 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个 ...

  6. layui template list

    //第一步:编写模版.你可以使用一个script标签存放模板,如: <script id="demo" type="text/html"> < ...

  7. c 使用lua 示例

    #include <stdio.h> #include <string.h> #include <lua.h> #include <lauxlib.h> ...

  8. java实现一个简单的验证码生成器

    最近看了网上很多大佬们写的验证码生成,寻思着自己也写一个,话不多说,代码如下: import java.awt.BasicStroke; import java.awt.Color; import j ...

  9. Android版本之间的区别

    不同版本SDK适配要点 1,指定minSDKVersion与targetSDKVersion 2,运行时获取版本号 3,使用系统内置的主题,会随着版本的更换而自动适配 4,用android提供的注解 ...

  10. LC 562. Longest Line of Consecutive One in Matrix

    Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be horiz ...