C学习笔记-makefile
除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,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的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- Makefile的学习笔记
Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报 分类: Linux ...
- Linux 编程学习笔记----动笔makefile档
Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...
- <转>Windows平台下Makefile学习笔记(二)
本文转自:http://blog.csdn.net/clever101/article/details/8286066 上次我们学习了怎么用Makefile编译一个控制台工程.这次我们学习一下如何使用 ...
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- 转:openwrt中luci学习笔记
原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发 ...
- android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...
- linux 驱动学习笔记01--Linux 内核的编译
由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...
随机推荐
- Acwing-202-最幸运的数字(同余, 欧拉定理)
链接: https://www.acwing.com/problem/content/204/ 题意: 8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字. 现在给定一个正整数 ...
- Ion-select and ion-option list styling 自定义样式
https://forum.ionicframework.com/t/ion-select-and-ion-option-list-styling/117028
- xss跨站攻击原理
https://www.cnblogs.com/frankltf/p/8975010.html 跨站脚本攻击:通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一旦攻击成功,它可以获取用户 ...
- VirtualBox:无法访问共享文件夹
造冰箱的大熊猫@cnblogs 2019/5/9 问题:VirtualBox中安装Linux虚拟机,设置宿主机某个文件夹为虚拟机的共享文件夹.在虚拟机中,该共享文件夹显示为“sf_×××”,打开该文件 ...
- MessagePack Java 0.6.X 不使用注解(annotations)来序列化
如果你不能添加 @Message 到你的定义对象中但是你还是希望进行序列化.你可以使用 register 方法来在类中启用序列化对象. 如下的代码所示: MessagePack msgpack = n ...
- codevs 3022 西天收费站 x
题目描述 Description 唐僧师徒四人终于发现西天就在眼前,但猴子突然发现前面有n个收费站(如来佛太可恶),在每个收费站用不同的方式要交的钱不同,输入 ...
- Thread(简单使用)
/***thread.c***/#include<stdio.h> #include<stdlib.h> #include<pthread.h> void prin ...
- ValueError: Cannot assign "\<QuerySet [<Area: China>]\>": "Area.parent" must be a "Area" instance.
在研究才Django自关联的过程中,在插入数据时爆出如下错误: ValueError: Cannot assign "<QuerySet [<Area: China>]&g ...
- gRPC-Web正式发布
前言: gRPC-Web是一个JavaScript客户端库,可以使Web应用程序直接与后端gRPC服务进行通信,而无需HTTP服务器充当中介. 这意味着可以通过使用.proto文件定义客户端和服务器端 ...
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...