先來簡單談談生成一個可執(zhí)行文件所需要的過程
預處理(preprocessing)->編譯(compilation)->匯編(assembly)->連接(linking)
接下來通過兩個簡單的例子來簡單分析Makefile編譯:.c->.s 匯編:.s->.o 連接:多個.o合并成一個可執(zhí)行文件。
在平常通過將上述四步統(tǒng)稱為“編譯”
Makefile三大組成:目標、依賴、命令
一Makefile命令能被執(zhí)行條件。
目標不存在 (對應下面沒有hello這個文件) 依賴已更新 (對應下面hello.c或a.c修改了)
如linux內核中那么多文件,修改某個重新編譯某個,重新連接所有!
hello:hello.c a.c
gcc -o hello.c a.c
二
實際在裸機開發(fā)的運用
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可執(zhí)行文件
arm-linux-objcopy -O binary -S led_on_elf led_on.bin 將可在linux執(zhí)行的ELF文件復制成能在開發(fā)板執(zhí)行的文件
$^
–所有的依賴文件。$@
–目標文件。$<
–第一個依賴文件。
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
上面經(jīng)過簡寫如下:
hello:hello.o a.o
gcc -o $@ $^
%.o:%.c
gcc -o $@ -c $^