來認識一下原始碼編譯的流程:
- 先使用 vi 去編輯 C 的原始碼檔案,且必需使用「.c」的附檔名,如 barry.c。
- 執行 gcc 來對 xxx.c 進行編譯。
- 編譯過程中會產生目標檔 (xxx.o),連結器會將此目標檔與函式庫做個連結。
- 最後就會產生可執行的 binary file。
舉個簡單的例子,首先請您先使用 vi 去編輯 barry.c:
suse:/tmp # vi barry.c #include <stdio.h> main(void) { printf("Hello,everybody!\n"); printf("I am barry.\n"); } |
再來執行 gcc (請確定您 gcc 相關套件有安裝):
suse:/tmp # gcc -c barry.c suse:/tmp # ls barry.c barry.o ← 產生目標檔。 suse:/tmp # gcc -o barry barry.o suse:/tmp # ls barry.c barry.o barry ← 產生了 binary file。 suse:/tmp # ./barry Hello,everybody! I am barry. |
如果您要直接產生 binary file,也可執行「gcc -o barry barry.c」。或許您又會有疑問,既然可以直接產生 binary file,那為何上面的範例不這樣做呢 ? 因為實際上程式設計師所編寫的原始碼檔案,在編譯過程常會使用到其他原始碼檔案所產生的目標檔,所以才會採用範例中的方式來產生 binary file。
不過 tarball 裡的原始碼檔案往往為數不少,為了簡化我們的操作程序,可以使用 make 指令來執行這項工作,但您需要先去編輯 Makefile 檔案,因為 make 會讀取 Makefile 或 makefile 的內容:
suse:/tmp # vi Makefile target_first: barry barry: gcc -c barry.c gcc -o barry barry.o install: install -m 755 barry /home/mary/bin uninstall: rm -f /home/mary/bin/barry distclean: rm -f barry barry.o |
在 Makefile 裡頭,包含了很多 target,您在「:」左邊所看到的都是屬於 target,至於這個 target 所要執行的程式,則是設定在 target 底下,且必須使用 Tab 鍵來取間格。
當您執行 make 指令時,會使用 Makefile 裡所定義的第一個 target,以這個範例來說就是 target_first,而 target_first 又指向 barry 這個 target,所以最後會執行 barry target 底下的程式。
當執行 make install 時,那當然就執行 install target 其下的程式囉 ! 所以 install 程式就會把 barry 這個 binary file 複製到 /home/mary/bin 目錄裡,並指定此 binary file 的權限為 755。最後的 make uninstall 及 make distclean 應該不用解釋了吧 !
接著就來做個測試:
suse:/tmp # make gcc -c barry.c gcc -o barry barry.o # 根據 Makefile 內容來開始進行編譯。 suse:/tmp # ls Makefile barry barry.c barry.o # 執行 make 指令後,就產生了 barry.o ( object file ) 及 barry ( binary file )。 suse:/tmp # make install install -m 755 barry /home/mary/bin # 執行 Makefile 裡 target 為 install 中的指令,也就是把 barry 複製到 /home/mary/bin 裡。 suse:/tmp # ls /home/mary/bin barry # barry 已被複製到 /home/mary/bin 中了。 suse:/tmp # make uninstall rm -f /home/mary/bin/barry # 執行 Makefile 裡 target 為 uninstall 中的指令,也就是刪除 /home/mary/bin/barry。 suse:/tmp # make distclean rm -f barry barry.o # 執行 Makefile 裡 target 為 distclean 中的指令,也就是刪除 barry 及 barry.o 這兩個檔案。 |
留言列表