來認識一下原始碼編譯的流程:

  1. 先使用 vi 去編輯 C 的原始碼檔案,且必需使用「.c」的附檔名,如 barry.c。
  2. 執行 gcc 來對 xxx.c 進行編譯。
  3. 編譯過程中會產生目標檔 (xxx.o),連結器會將此目標檔與函式庫做個連結。
  4. 最後就會產生可執行的 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 uninstallmake 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 這兩個檔案。

arrow
arrow
    全站熱搜

    BB 發表在 痞客邦 留言(0) 人氣()