Makefile
Makefile 包含5项
显示规则隐晦规则:
引用其他makefile
Include<filename>
Makefile永远执行第一个规则,下面的例子就会执行main后面的main.o class.o student.o没有才到下面的规则中找,我们在每个文件最开始写上all:main
#解析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