如何写一个精简的Makefile

Makefile

Makefile 包含5

显示规则隐晦规则:

引用其他makefile

Include<filename>

Makefile永远执行第一个规则,下面的例子就会执行main后面的main.o class.o student.o没有才到下面的规则中找,我们在每个文件最开始写上allmain

#解析makefile

文件:内含main.c class.c class.h student.c student.h

main : main.o class.o student.o

      gcc main.o class.o student.o –o main

main.o : main.c

      gcc –c main.c –o main.o

class.o : class.c

      gcc –c class.c –o class.o

student.o : student.c

      gcc –c student.c –o student.o

这样写发现下面每条语句都要用到gcc 因此可以引入变量是makefile简洁。

文件升级1

CC = arm-linux-gcc

all main

main : main.o class.o student.o

      $(CC)  main.o class.o student.o –o main

main.o : main.c

      $(CC) –c main.c –o main.o

class.o : class.c

      $(CC) –c class.c –o class.o

student.o : student.c

      $(CC) –c student.c –o student.o

继续寻找简化:发现下面的规则中每一个依赖都会在后面的命令中出现一次于是我们引入系统环境变量$<(表示为第一个依赖),继续升级用$<表示第一个依赖

文件升级2

CC = arm-linux-gcc

all main

main : main.o class.o student.o

      $(CC)  main.o class.o student.o –o main

main.o : main.c

      $(CC) –c $< –o main.o

class.o : class.c

      $(CC) –c $< –o class.o

student.o : student.c

      $(CC) –c $< –o student.o

由上面可发现同样每一个目标在命令后同样出现了一次于是我们又可以引入另一个系统环境变量:$@(第一个目标)

升级3

CC = arm-linux-gcc

all main

main : main.o class.o student.o

      $(CC)  main.o class.o student.o –o $@

main.o : main.c

      $(CC) –c $< –o $@

class.o : class.c

      $(CC) –c $< –o $@

student.o : student.c

      $(CC) –c $< –o $@

上面文件是否还有更精简版本?有我们可以看到第一个规则,后面的3个依赖在下面的命令中出现了,而$<只表示第一个依赖显然这里不适合,这里系统给出了所有依赖的环境变量简写:$^

升级4

CC = arm-linux-gcc

all main

main : main.o class.o student.o

      $(CC)  $^ –o $@

main.o : main.c

      $(CC) –c $< –o $@

class.o : class.c

      $(CC) –c $< –o $@

student.o : student.c

      $(CC) –c $< –o $@

最后来一个makefile自动推导功能------如果规则中依赖项出现了main.o文件 makefile会自动在当前目录下找main.c文件将其生成main.o文件(即是寻找同名文件)

升级5

CC = arm-linux-gcc

all main

main : main.o class.o student.o

      $(CC)  $^ –o $@

上面这么多版本结果都一样,上面的有人还把下面的各个.o文件做成变量形式

CC = arm-linux-gcc

all main

OBJS = main.o class.o student.o

main : $(OBJS)

      $(CC)  $^ –o $@

以上是在GCC上 那么如何生成能下载到开发板上运行的。bin文件呢?

我们对每个.c或.S源文件进行单独编译 但是不去链接 生成很多.o文件---言外之意 源文件首先先变成.o文件(.c .S ==> .o)

其次这些生成的.o文件组合需要按一定的顺序,因为彼此有很多关联,比如先运行main。c 然后遇到需要调用别的源文件再所以main.o一般放在首位(当然都在启动代码后)

并且最后生成的.bin文件是需要下载到开发板上运行的,所以程序运行在哪个地址都需要有说明和指定 下面看如何具体生成一个。bin文件

一、生成。o文件

         arm-linux-gcc -c -o main.o main.c

        命令格式:

       arm-linux-gcc -Wall -O2 -c -o $@ $<

以上的条件项用到时再去查  比如优化啊  输出警告信息啊。。。。。。

二、链接。o文件生成可执行文件filename_elf

          arm-linux -ld -o usart_elf main.o usart.o

三、将可执行文件转换成开发板上能运行的.bin文件,需要用到转换指令-objcopy

         arm-linux-objcopy -o binary usart_elf usart.bin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值