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 工程管理的更多相关文章

  1. Makefile 工程管理

    Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...

  2. ARM裸机开发之交叉工具链和MakeFile工程管理

    一.交叉工具链 嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序.在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链.下 ...

  3. Makefile工程管理器及万能模板

    ​ Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员.在 Linux(unix )环境下使用GNU 的m ...

  4. 1-3 编程基础 makefile工程管理

    GNU make Linux程序员必须学会使用GNU make来构建和管理自己的软件工程.GNU的make能够使整个工程的编译.链接只需要一个命令就可以完成. makefile make在执行时,需要 ...

  5. 6、GNU makefile工程管理学习的一个例子

    在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...

  6. linux应用程序设计--Makefile工程管理

    Makefile文件描述了整个工程的编译.链接等规则.包括:工程中哪些源文件需要编译以及如何编译:需要创建哪些库文件以及如何创建这些库文件.如何产生最终的可执行文件. Makefile相关术语 1.规 ...

  7. makefile工程管理

    个人理解吧,makefile就是写一个指定格式的文件,将一系列的编译.链接.转换等操作打包在一起,方便以后一键生成可执行的二进制文件而产生的.下面记录一下这种文件的写法,方便以后忘了来查询. make ...

  8. [国嵌笔记][017][Makefile工程管理]

    Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...

  9. 学习总结:工程管理与makefile

    工程管理与makefile 一.为什么需要makefile和make 一个工程中的源文件可能很多,按照类型.功能.模块分别放在若干个目录中,为了有效地管理软件工程,更高效地编译整个工程,需要用到mak ...

随机推荐

  1. git .gitignore

    github 搜索 .gitignore 外层为语言使用的,里层为编译器使用的,分别添加到自己的文件中. 目前Androidstudio使用gradle作为项目管理,.idea   .iml  文件都 ...

  2. php部分---文件上传:错误处理、 客户端和服务器端的限制

    1.客户端页面 <!---客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" ----- ...

  3. 实验1_IPv6地址配置

    IPv6地址配置 实验任务 (1)掌握如何在路由器及PC上配置IPv6地址 (2)掌握如何用IPv6 ping命令进行IPv6地址可达性检查 (3)掌握如何用命令来查看IPv6地址配置 实验过程 在R ...

  4. LEETCODE —— Maximum Subarray [一维DP]

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  5. IO:InputStream

    InputStream类(java.io.InputStream) public abstract class InputStream extends Object implements Closea ...

  6. Python非阻塞网络通信Howto

    在Python中,你使用socket.setblocking(0)使它无阻塞.在C中,它更复杂,(一方面,你需要在BSD风格O_NONBLOCK和几乎不可区分的Posix风味O_NDELAY之间进行选 ...

  7. 利用C语言获得网页编码

    #include <stdio.h> #include <winsock.h> #include <string.h> #pragma comment(lib, & ...

  8. Django值Cookie基础

    一.什么是Cookie? Cookies就是服务器暂时存放在你的电脑里的资料(.txt格式的文本文件),好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上 ...

  9. time 模块

    import time导入时间模块print(time.strftime("%Y-%m-%d %X"))其中 time.strftime("Y-%m-%d")输 ...

  10. arcgis 10.2连接Oracle