使用GCC编译单个文件比较方便,但是当工程文件较多时,则需要一个脚本工具,来简化编译步骤,提高效率,而Makefile刚好能解决此类问题。
在终端上输入make命令就可以,编译上面的文件,会生成一个可执行文件;输入make clean就可以清除所有的 .o 文件
使用交叉编译,arm-linux-gcc
objs = start.o main.o init.o objs += lcd/font.o objs += lcd/framebuffer.o objs += lcd/geometry.o all: $(objs) arm-linux-ld -T out.lds $^ -o out.elf arm-linux-objcopy -O binary -S out.elf out.bin arm-linux-objdump -D out.elf > out.dis clean: rm *.bin *.o *.elf *.dis %.o : %.c arm-linux-gcc -march=armv4 -c -o $@ $< %.o : %.S arm-linux-gcc -march=armv4 -c -o $@ $< $(objs) : 表示对变量 objs 的引用objs += lcd/font.o : 表示在第一个objs目标下增加一个lcd目录下的font.o文件,这里 += 表示增加的意思。arm-linux-ld -T out.lds $^ -o out.elf : arm-linux-ld:表示链接-T :指明代码段、数据段、bss端,这里运用了一个out.lds链接脚本,里面就是定位这些段所在的位置。-o(小写o:output):就是运用前面(out.lds、 $^)这些文件输出一个out.elf文件(.elf是一个可执行文件 linux中)。 arm-linux-objcopy -O binary -S out.elf out.bin: 通过源文件out.elf得到一个二进制文件out.bin arm-linux-objcopy:复制目标文件的内容到另外一个文件-O binary(大写O):使用指定格式的格式输出文件,这里是指定为二进制-S(大写S):不从原文件中复制重定位信息和符号到目标文件中去out.bin:一个二进制文件,开发本上所运行的文件,也就是我们想得到的 arm-linux-objdump -D out.elf > out.dis: 通过源文件out.elf得到一个反汇编文件out.dis arm-linux-objdump:得到一个反汇编文件-D:反汇编所有的段(代码段、数据段、bss段) arm-linux-gcc -march=armv4 -c -o $@ $< : 中 -march=armv4 表示以armv4指令进行编译%.S(大写S) : 是指start.S文件,cpu启动之后第一个运行的文件,它里面有异常向量表,代码重定位,main函数等等