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

    技术2025-12-21  15

    一、简介:

    使用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函数等等
    Processed: 0.013, SQL: 9