Makefile初探

1、为什么需要Makefile

Makefile是用来管理工程的。
在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,就会像这样:gcc a.c b.c c.c d.c e.c f.c g.c -o exe 每次编译都要输入一堆东西很麻烦,

这个问题严重影响工作效率,怎么办?Makefile来解决

2、一个简单的Makefile示例

all: a.c b.c
gcc a.c b.c -o exe
clean:

rm exe

3、Makefile中的一些基本概念

目标:目标定格写,后面是冒号(冒号后面是依赖)
依赖:依赖是用来产生目标的原材料。
命令:命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作。

4、Makefile的基本工作原理

其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。
其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。   最新的就不会执行

其三,我们直接执行make 和make 第一个目标效果是一样的。(第一个目标其实就是默认目标)

5、ARM裸机中用到的Makefile介绍

裸机程序中的Makefile是把程序的编译和链接过程分开的。(平时我们用gcc a.c -o exe这种方式来编译时,实际上把编译和链接过程一步完成了,在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld)

all:

    arm-linux-gcc -c -o led_on.o led_on.S  #-c就是只编译不连接   -o用来指定名字

    arm-linux-ld-Ttext 0 led_on.o -o led_on.elf   #链接
    arm-linux-objcopy -O binary -S led_on.elf led_on.bin
clean:
    rm *.bin *.o*.elf 

链接器得到led.elf其实就是我们的可执行程序,(如果是在操作系统下,这个led.elf就可以执行了)但是在嵌入式裸机中我们需要的是可以烧写的文件(可烧写的文件就叫镜像image),因此我们需要用这个led.elf为原材料来制作镜像,制作工具是交叉编译工具链中的arm-linux-objcopy得到可以烧录的bin文件


我们还可以使用arm-linux-objdump工具进行反编译(反汇编),objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码

arm-linux-objdump -D led.elf > led_elf.dis

-D表示反汇编 > 左边的是elf的可执行程序(反汇编时的原材料),>右边的是反汇编生成的反汇编程序

反汇编其实就是把编译后的elf格式(BIN格式不行,好多东西BIN格式的都删减了)的可执行程序给反过来的到对应的汇编程序,的到它的汇编源代码。我们使用反汇编主要是用来学习。反汇编不一定和源程序完全一样。



参考文献:

朱老师课件

你可能感兴趣的:(Makefile初探)