對於linux下交叉編譯鏈以及Makefile的簡單理解
linux下交叉工具鏈的使用
我們想要通過編寫的程序得到可執行文件,必須要經過編譯、彙編、鏈接的過程。
編譯:.c->.s 彙編:.s->.o 連接:多個.o合併成一個可執行文件。 在平常通過將上述四步統稱為「編譯」。
其中比較常用的交叉編譯工具以及簡單用法如下:
arm-linux-gcc -g -c xxx.S //生成xxx.o文件,只編譯不連接
arm-linux-ld -Txxx.lds -o xxx.elf cxxx.o //生成elf可執行文件
arm-linux-ld -T(鏈接器腳本)-o (輸出文件名.elf)(依賴文件.o)
arm-linux-readelf -a xxx.elf//查看程序的大小信息和運行的平台
arm-linux-objdump -D -S xxx >dump
-D:顯示所有對應的彙編代碼
-S:源代碼和彙編代碼一一對應顯示,前提是編譯的時候帶上-g,即arm- linux-gcc -g xxx.c -o xxx
>dump:輸出到dump中,以為有時候生成的彙編代碼太多
arm-linux-objcopy -O binary xxx.elf xxx.bin//生成二進位文件
-O:輸出文件格式後面加binary就是二進位
Makefile使用規則
有時候我們需要編譯幾十幾百個文件的時候總不能一個文件一個文件編譯,那麼強大的工具Makefile就有他的用武之地了。在我們學編程語言、單片機的時候,點擊rebuild就可以執行編譯,Makefile就可以類比他們的內部機制。Makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
Makefile的核心---規則 :
目標 : 依賴1 依賴2 ...
[TAB]命令
當"目標文件"不存在,
或
某個依賴文件比目標文件"新",
則: 執行"命令"
當我們想把c文件編譯鏈接為二進位文件時,我們需要執行以下步驟:
此時我們創建一個Maklefile文件,並且簡單的把編譯步驟寫進Makefile文件,如下:
接著我們看一下Makefile的作用。
首先我們使用make clean刪除*.bin *.o *.elf *.dis,然後使用make命令直接就可以編譯鏈接生成.bin文件了。
接下來是掌握Makefile的簡單的語法。
a. 通配符: %.o
$@ 表示目標
$
$^ 表示所有依賴文件
b. 假想目標: .PHONY
c. 即時變數、延時變數, export
簡單變數(即時變數) :
A := xxx # A的值即刻確定,在定義時即確定
B = xxx # B的值使用到時才確定
:= # 即時變數
= # 延時變數
?= # 延時變數, 如果是第1次定義才起效, 如果在前面該變數已定義則忽略這句
+= # 附加, 它是即時變數還是延時變數取決於前面的定義
Makefile函數
a. $(foreach var,list,text)
b. $(filter pattern...,text) # 在text中取出符合patten格式的值
$(filter-out pattern...,text) # 在text中取出不符合patten格式的值
c. $(wildcard pattern) # pattern定義了文件名的格式,
# wildcard取出其中存在的文件
d. $(patsubst pattern,replacement,$(var)) # 從列表中取出每一個值
# 如果符合pattern
# 則替換為replacement
接下來運用一下以上的知識點。
分別把hello.c、hello2.c、main.c、以及含有hello2.h的include文件夾放在linux的目錄下。
此時輸入make即可編譯鏈接出可執行程序以及相關的依賴文件.d文件。
Makefile文件代碼如下:
以上是我的簡單理解,如有不當和疏漏之處,請與指正。


TAG:奮鬥的羅同學 |