Makefile快速入门(实际工程为例)

一、简介:

使用GCC编译单个文件比较方便,但是当工程文件较多时,则需要一个脚本工具,来简化编译步骤,提高效率,而Makefile刚好能解决此类问题。

二、进入正题:

1、Makefile格式

 Target:Depends
 		cmmand
  • Target:称之为目标
  • Depends:称之为依赖
  • cmmand:为要执行的命令(注意:命令前面必须有一个TAB键)
gcc选项说明:
1. -c  (小写c)   编译、汇编指定的源文件,但是不进行链接    gcc -c
2. -S  (大写S)	编译指定的源文件,但是不进行汇编          gcc -S
3. -E  (大写E)	预处理指定的源文件,不进行编译            gcc -E
4. -o  (小写o)	将文件 file2 编译成可执行文件 file1      gcc -o file1 file2
5. -I  (大写I)	指定包含的头文件的目录                   gcc -I directory
6. -g  (小写g)  生成调试信息                             gcc -g

2、简单使用Makefile

objs = main.o init.o start.o
	gcc -c -o $@ $^
%.o:%.c
	gcc -c -o $@ $<   
%.o:%.S
	gcc -c -o $@ $<
clean:
	rm *.o

  • $@:表示目标
  • $<:表示左边第一个依赖
  • $^:表示所有的依赖
  • %.o:表示所有的.o文件,这里%是一个通配符
  • rm *.o:表示删除所有的.o文件,这里 * 也是一个通配符
  • objs:是定义的一个变量

在终端上输入make命令就可以,编译上面的文件,会生成一个可执行文件;输入make clean就可以清除所有的 .o 文件

3、实际工程中Makefile的使用

使用交叉编译,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函数等等

你可能感兴趣的:(Makefile)