簡單談談Makefile和交叉編譯工具鏈
阿新 • • 發佈:2019-01-10
先來簡單談談生成一個可執行檔案所需要的過程
預處理(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 $^