1. 程式人生 > >簡單談談Makefile和交叉編譯工具鏈

簡單談談Makefile和交叉編譯工具鏈

先來簡單談談生成一個可執行檔案所需要的過程

預處理(preprocessing)->編譯(compilation)->彙編(assembly)->連線(linking)

編譯:.c->.s 彙編:.s->.o 連線:多個.o合併成一個可執行檔案。
在平常通過將上述四步統稱為“編譯”

接下來通過兩個簡單的例子來簡單分析Makefile

Makefile三大組成:目標、依賴、命令

Makefile命令能被執行條件。


  • 目標不存在 (對應下面沒有hello這個檔案)
  • 依賴已更新 (對應下面hello.c或a.c修改了)

如linux核心中那麼多檔案,修改某個重新編譯某個,重新連線所有!

hello:hello.c a.c
    gcc -o hello.c a.c

實際在裸機開發的運用

led_on.bin : led_on.S
    arm-linux-gcc -g -c -o led_on.o led_on.S        #-g:加入除錯資訊 -c只編譯不連線
    arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf  #-Ttext 0x0000000:指定程式碼段地址0.
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
#-O:使用指定格式來輸出檔案 # binary:二進位制的 -S:不從原始檔複製重定位資訊和符號資訊到目標檔案中去 clean: rm -f led_on.bin led_on_elf *.o

arm-linux-gcc -g -c -o led_on.o led_on.S 因為加了-c選項,做了前三個步驟,預處理、編譯、彙編原始檔,但是不作連線。
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf 將前三個步驟生成的.o檔案連線成ELF可執行檔案
arm-linux-objcopy -O binary -S led_on_elf led_on.bin 將可在linux執行的ELF檔案複製成能在開發板執行的檔案

補充常用的概念

$^–所有的依賴檔案。[email protected]–目標檔案。$<–第一個依賴檔案。

hello:hello.o a.o
    gcc -o hello hello.o a.o
hello.o:hello.c
    gcc -o hello.o -c hello.c
a.o:a.c
    gcc -o a.o -c a.c

上面經過簡寫如下:

hello:hello.o a.o
    gcc -o [email protected] $^
%.o:%.c
    gcc -o [email protected] -c $^