以下內容 參考
大致規則:
目標(target) ... : 依賴(prerequisites) ...
命令(command)
......
其中,target也就是乙個目標檔案,可以是object file,也可以是執行檔案。prerequisites就是,要生成那個target所需要的檔案或是目標。command也就是make需要執行的命令。
下面舉幾個韋老師書上的例子:
對於 arm-linux-gcc arm-linux-ld arm-linux-objcopy arm-linux-objdump的用法 可以參考
led 的例子:
led.bin : led.c led.s
arm-linux-gcc -c -o ledc.o led.c ( -c 只編譯,不連線)
arm-linux-gcc -c -o leds.o led.s
arm-linux-ld -ttext 0x00000000 ledc.o leds.o -o led_elf
arm-linux-objcopy -o binary -s led_elf led.bin
clean:
rm -f led.bin led_elf *.o
( arm-linux-objcopy 被用來複製乙個目標檔案的內容到另乙個檔案中.此選項可以進行格式的轉換;
在實際程式設計的,用的最多的就是,將elf格式的可執行檔案轉換為二進位制檔案.
如: arm-linux-objcopy –o binary –s elf_file bin_file,其中 -o 後面加 輸出的格式;
-s 表示不從原始檔中複製重定位資訊和符號資訊到目標檔案中 )
sdram 的例子:
sdram.bin : led.c sdram.s
arm-linux-gcc -c -o ledc.o led.c
arm-linux-gcc -c -o sdram.o sdram.s
arm-linux-ld -ttext 0x30000000 ledc.o sdram.o -o sdram_elf
arm-linux-objcopy -0 binary -s sdram_elf sdram.bin
clean :
rm -f sdram.bin sdram.elf *.o
mmu 的例子
objs := head.o init.o leds.o( makefile檔案裡的賦值方法有兩種:延時變數、立即變數,前者在真正使用時變數的值才確實,後者在定義時就已經確定了;使用"=" "?=" "define"定義是延時變數,使用":="定義的變數是立即變數,這裡定義objs 是立即變數 )
mmu.bin :$(objs) (這裡相當於 mmu.bin : head.o init.o leds.o
)arm-linux-ld -tmmu.lds -o mmu_linux $^ ($@ 表示規則的目標檔名; $^表示所有依賴的名字;$< 表示第乙個依賴的檔名)
arm-linux-objcopy -o binary -s mmu_linux $@
arm-linux-objdump -d -m arm mmu_linux > mmu.dis (這裡參考目的是將反匯程式設計序寫到mmu.dis檔案中去,不從終端輸出
)%.o:%.c
arm-linux-gcc -wall -o2 -c -o $@ $<
%.o:%.s
arm-linux-gcc -wall -o2 -c -o $@ $<
clean :
rm -f mmu.bin mmu_linux mmu.dis *.o
makefile檔案編寫
hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...
Makefile檔案編寫
1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...
Makefile檔案編寫
main3.c 1 include 2 include static lib.h 3 include fun.h 4 5int main void static lib.h和 1 extern int add int a,int b 2 extern int sub int a,int b 3 ex...