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 ...
随机推荐
- 使用Hydra对ssh和rdp进行爆破的简单明令
使用方式 hydra <IP> ssh/rdp -l <USER> -p <PASSWORD> -V 使用大写的L和P,可以替换成字典文件进行爆破 如hydra & ...
- robotframework 模拟滚动鼠标到底部
Execute Javascript var ele = document.getElementsByClassName("right_main")[0];ele.scrollTo ...
- MySQL-InnoDB锁(一)
本文主要记录InnoDB存储引擎中锁的关键点,下篇文章通过实例确认加锁的范围. InnoDB中的锁 1. 锁提供数据完整性和一致性 2. InnoDB行级锁:共享锁(S)和排他锁(X). 为了支持多粒 ...
- .Net中手动实现AOP
序言 资料 https://www.cnblogs.com/farb/p/AopImplementationTypes.html
- JavaMail应用--通过javamail API实现在代码中发送邮件功能
JavaMail应用 在日常开发中,可能会引用到发邮件功能,例如在持续集成中,自动化测试运行完毕,自动将测试结果以报表的形式发送邮件给相关人.那么在Java中如何实现发邮件呢? 在java EE ...
- CUDA-F-2-0-CUDA编程模型概述1
Abstract: 本文介绍CUDA编程模型的简要结构,包括写一个简单的可执行的CUDA程序,一个正确的CUDA核函数,以及相应的调整设置内存,线程来正确的运行程序. Keywords: CUDA编程 ...
- 记一次关于springboot的netty版本冲突问题
冲突的地放其实很多,大概都是类似,找不到哪个方法了: 类似于: Error starting ApplicationContext. To display the conditions report ...
- Spring Boot注入RestTemplate ,出现空指针解决办法
SpringBoot 注入RestTemplate 我看了一下大都是让我们在启动类里面加一个Bean配置代码如下 @Autowired private RestTemplateBuilder buil ...
- 2018-2019-2 20165215《网络对抗技术》Exp9 :Web安全基础
目录 实验目的及内容 实验过程记录 一.Webgoat安装 二. 注入缺陷(Injection Flaws) (一)命令注入(Command Injection) (二)数字型注入(Numeric S ...
- legend3---lavarel多对多模型操作实例
legend3---lavarel多对多模型操作实例 一.总结 一句话总结: 在多对多模型中,增加关系表的数据 需要 弄一个和关系表一对多的模型关系 1.在lavarel关系模型中,课程和标签表是多对 ...