makefile初步

来源:互联网 发布:中医体质软件 编辑:程序博客网 时间:2024/06/05 16:48

声明
以下为个人学习笔记,各方面的理解还不够深,欢迎各位指正。
程序出处
朱老师物联网课程 - 裸机-led

首先是我的源码目录列表

Makefile //用于编译的脚本
mkv210_image//sd卡启动时,编译出来镜像文件需要添加校验头
start.S //源码

主要分析对象
Makefile的内容

led.bin: start.o     arm-linux-ld -Ttext 0x0 -o led.elf $^    arm-linux-objcopy -O binary led.elf led.bin    arm-linux-objdump -D led.elf > led_elf.dis    gcc mkv210_image.c -o mkx210    ./mkx210 led.bin 210.bin%.o : %.S    arm-linux-gcc -o $@ $< -c clean:    rm *.o *.elf *.bin *.dis mkx210 -f
  • 终端输入 make led.bin
    系统会去寻找 led.bin 这个标签,然后作为程序入口,我把它类比成switch case语句。 然后看到 led.bin: start.o这个语句,你肯定好奇,这个start.o 是什么,哪里来的。 如果将makefie的过程看做做菜,那么这个冒号后面的就是你需要的食材。那么我们首先要凑齐他们,start.o并没有在我们的源文件列表中,makefile也发现了这个问题,既然源文件中没有,那么久 看看自己有没有办法制造出来吧。
    然后它把shart.o 当成了一个新目标去执行,类似于执行了 一个 make start.o。这时候他遇到了
     %.o : %.S        arm-linux-gcc -o $@ $< -c
  %.o 这个%是个百搭,start.o 也就匹配了这一行,实际执行情况就是:
     start.o : start.S        arm-linux-gcc -o $@ $< -c
start.o这个材料需要用到 start.S,这个文件我们正好有。arm-linux-gcc  交叉编译工具(需要事先在系统上进行安装)-o   指定输出文件名  $@   这里指的是 start.o  目标$<   这里指的是 start.S  原料-c   指明:本次操作只编译不链接(至于什么是链接,后面博客再进行补充)这行执行完,会生成一个start.o文件。 好了,这样我们的原料 start.o 就有了。
  • 凑齐了原料,系统就回到我们的最终目标处执行
    led.bin: start.o         arm-linux-ld -Ttext 0x0 -o led.elf $^        arm-linux-objcopy -O binary led.elf led.bin        arm-linux-objdump -D led.elf > led_elf.dis        gcc mkv210_image.c -o mkx210        ./mkx210 led.bin 210.bin

逐行解释

    arm-linux-ld -Ttext 0x0 -o led.elf $^    对start.o进行链接,并且链接地址是0x00    详解:        arm-linux-ld    交叉工具链(用于链接)         -Ttext 0x0      指定链接地址为0x00        -o led.elf      生成文件 led.elf        $^              这里指 start.o    arm-linux-objcopy -O binary led.elf led.bin    arm-linux-objcopy  交叉工具链(复制)可指定复制后文件的格式     -O binary          (猜测)指定目标文件格式    led.elf led.bin     将led.elf 复制 保存成 led.bin    arm-linux-objdump -D led.elf > led_elf.dis    将led.elf可执行文件,反汇编到led_elf.dis    -D 反汇编所有段(段和链接的知识以后总结)    gcc mkv210_image.c -o mkx210    编译mkv210_image.c生成可执行文件mkx210(这是在linux下的可执行文件)    ./mkx210 led.bin 210.bin    带参数的程序,具体实现效果由mkx210决定。
  • make clean

编译过程结束。生成了led.bin以及一些附带文件。
还剩下一段没有被执行过的

clean:    rm *.o *.elf *.bin *.dis mkx210 -f
输入make clean就会执行rm *.o *.elf *.bin *.dis mkx210 -f按条件删除文件。

记性不好,仔细写写笔记还是挺有意思。

0 0
原创粉丝点击