除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,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. Netty入门 零基础

    因为接下来的项目要用到netty,所以就了解一下这个程序,奈何网上的教程都是稍微有点基础的,所以,就写一篇对于netty零基础的,顺便也记录一下. 先扔几个参考学习的网页: netty 官方API:  ...

  2. java源码学习(一)String

    String表示字符串,Java中所有字符串的字面值都是String类的实例,例如"ABC".字符串是常量,在定义之后不能被改变,字符串缓冲区支持可变的字符串.因为 String ...

  3. Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发

    所属专栏: Vue 开发学习进步 说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手架 ...

  4. 原生Js_实现广告弹窗

    广告样式当页面加载后5s刷新在右下角 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  5. flask 第六篇 flask内置的session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  6. git *** Please tell me who you are.错误

    GIT 中提示 please tell me who you are   如果使用git过程中出现了,please tell me who you are ,需要设置一下使用者的身份. 1.git c ...

  7. PHP JQurey

    JQuery是用JS编写的程序,使用起来比JS更为简单,使用前需引入一个JQurey文件,下面为JQurey语法 <script type="text/javascript" ...

  8. [学习笔记] Tangent Distance

    Tangent Distance 简介 切空间距离可以用在KNN方法中度量距离,其解决的是图像经过有限变换之后还能否被分类正确,例如.对一张数字为5的手写数字图片,将其膨胀后得到图像p1,此时KNN还 ...

  9. 使用Aria2+Aria2Ng+OneIndex+OneDrive建立不限流量/离线BT下载/在线观看网盘/在线存储分享平台

    获取OneDrive 自行搜索或者宝购买 安装 1.安装宝塔 #Centos系统 yum install -y wget && wget -O install.sh http://do ...

  10. vmalloc详解

    vmalloc是一个接口函数, 内核代码使用它来分配在虚拟内存中连续但在物理内存中不一定连续的内存. 只需要一个参数,以字节为单位. 使用vmalloc的最著名的实例是内核对模块的实现. 因为模块可能 ...