1.3 Makefile 工程管理
1. 为什么得用Makefile
单步命令生成led.bin
[root@cfm880 lesson1]# cd ..
[root@cfm880 Part1]# mkdir lesson3
[root@cfm880 Part1]# cd lesson3
[root@cfm880 lesson3]# chmod 777 ./
[root@cfm880 lesson3]# ls
led.lds led.S Makefile
[root@cfm880 lesson3]# arm-linux-gcc -g -c led.S led.o
[root@cfm880 lesson3]# arm-linux-ld -Tled.lds -o led.elf led.o
[root@cfm880 lesson3]# ls
led.elf led.lds led.o led.S Makefile
[root@cfm880 lesson3]# arm-linux-objcopy -O binary led.elf led.bin
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
如果是命令太多,我们不可能手动输入太多命令
我们需要更有效的工具
[root@cfm880 lesson3]# make clean
rm *.o led.elf led.bin
[root@cfm880 lesson3]# make
arm-linux-gcc -g -o led.o -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
把很多命令合成一个命令
make
需要自己编写Makefile文件完成自动编译
Makefile文件
all: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o led.o -c led.S
.PHONY: clean
clean:
rm *.o led.elf led.bin
Makefile规则
Target:prerequisites
Commad #一个tab
目标:依赖
命令
Led.elf: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
伪目标:只有命令没有依赖用.PHONY标明伪目标
clean:
rm *.o led.elf led.bin
arm-linux-gcc -g -o led.o -c led.S
[root@cfm880 lesson3]# ls
led.lds led.o led.S Makefile
[root@cfm880 lesson3]# make
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
make后没有参数默认第一条命令
变量
App1: app1.o func1.o func2.o
Gcc app1.o func1.o func3.o –o app1
App2: app2.o func1.o func2.o –o app2
使用默认变量
Obj=func1.0 func2.o
App1: app1.o $(obj)
Gcc app1.o $(obj) –o app1
App2:app2.o $(obj)
Gcc app2.o $(obj) –o app2
直接使用系统定义的默认变量
$^:代表所有的依赖文件
$@:代表目标
$<:第一个依赖文件
简化Makefile
all: led.o
arm-linux-ld -Tled.lds -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
.PHONY: clean
clean:
rm *.o led.elf led.bin
通用规则
led.o : led.S
arm-linux-gcc -g -o $@ -c $^
main.o : main.S
arm-linux-gcc -g -o $@ -c $^
两条规则他们的命令一样,目标与依赖的名字只有后缀名不样
%.o : %.S
arm-linux-gcc -g -o $@ -c $^
可以替换上面两条语句
3. 使用技巧
回显:不需要打印命令
all: led.o
@arm-linux-ld -Tled.lds -o led.elf $^
@arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
@arm-linux-gcc -g -o $@ -c $^
.PHONY: clean
clean:
rm *.o led.elf led.bin
[root@cfm880 lesson3]# make
[root@cfm880 lesson3]# ls
led.bin led.elf led.lds led.o led.S Makefile
Makefile文件名加 –f 选项
[root@cfm880 lesson3]# mv Makefile file
[root@cfm880 lesson3]# make
make: *** 没有指明目标并且找不到 makefile。 停止。
[root@cfm880 lesson3]# make -f file
[root@cfm880 lesson3]# ls
file led.bin led.elf led.lds led.o led.S
1.3 Makefile 工程管理的更多相关文章
- Makefile 工程管理
Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...
- ARM裸机开发之交叉工具链和MakeFile工程管理
一.交叉工具链 嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序.在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链.下 ...
- Makefile工程管理器及万能模板
Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员.在 Linux(unix )环境下使用GNU 的m ...
- 1-3 编程基础 makefile工程管理
GNU make Linux程序员必须学会使用GNU make来构建和管理自己的软件工程.GNU的make能够使整个工程的编译.链接只需要一个命令就可以完成. makefile make在执行时,需要 ...
- 6、GNU makefile工程管理学习的一个例子
在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...
- linux应用程序设计--Makefile工程管理
Makefile文件描述了整个工程的编译.链接等规则.包括:工程中哪些源文件需要编译以及如何编译:需要创建哪些库文件以及如何创建这些库文件.如何产生最终的可执行文件. Makefile相关术语 1.规 ...
- makefile工程管理
个人理解吧,makefile就是写一个指定格式的文件,将一系列的编译.链接.转换等操作打包在一起,方便以后一键生成可执行的二进制文件而产生的.下面记录一下这种文件的写法,方便以后忘了来查询. make ...
- [国嵌笔记][017][Makefile工程管理]
Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...
- 学习总结:工程管理与makefile
工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...
随机推荐
- 【python】jiraAPI使用教程 自动创建jira问题单并置状态为OPEN
环境依赖 : python库 redis jira 安装命令:pip install redis pip install jira redis服务安装命令: $sudo apt-get update ...
- 自执行函数与setTimeout结合计算
var v1=0,v2=0,v3=0; for(var i=1;i<=3;i++){ var i2=i; (function(){ ...
- 关于css3
1.选择器: 属性选择器:[]; 查找条件:属性:我们可以通过属性来查找[^=][$=][*=][=][attr] 伪类选择器: ::: ::before:::after: 必须指定一个conten ...
- Android Saving Data(二)
Saving File android读写文件的形式和普通的java IO的方式并没有什么不同,唯一有所限制的是当我们创建文件的时候不能够在像javaSE那样随意了.一般android读写文件有两种形 ...
- (转) Deep Learning Research Review Week 2: Reinforcement Learning
Deep Learning Research Review Week 2: Reinforcement Learning 转载自: https://adeshpande3.github.io/ad ...
- C++程序设计(关于函数中数组传递的一点心得)
题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分: ...
- 承接Hololens游戏外包
近日,微软宣布第三批微软Hololens开发者版开始发货,包括:头显.头显手提包和一个遥控器.前两批开发者版本分别在今年3月30日和5月9日开始发货的. 第三批AR头显Hololens开发者版发货 虽 ...
- VR全景项目外包团队— VR/AR相关领域介绍和VR全景案例
VR/AR相关领域这里我要说的一点就是硬件.诚然,硬件的确很难搞,国内在这方面就是荒漠,所以,如果你有信心,完全可以开拓一片蓝海.注意我是说真正的硬件,那些把Google的纸盒子拿来改改就能融资千万的 ...
- laravel/lumen 单元测试
Testing Introduction Application Testing Interacting With Your Application Testing JSON APIs Session ...
- docker使用中国镜像
最近使用docker,在国内下载速度很不稳定,所以一直在找中国的镜像仓库,又是改配置又是命令行,最后发现网易提供了一个不错的公共仓库,直接从仓库下载就可以了 docker pull hub.c.163 ...