1. 程式人生 > >Linux | GCC如何實現程式碼編譯&&彙編&&連結過程

Linux | GCC如何實現程式碼編譯&&彙編&&連結過程

   正文:

 

    每次我們程式設計師所寫的 程式碼 是給程式設計師看的呢?還是給電腦看的?其實我們所寫的程式碼只是我們程式設計師之間交流的一樣特殊語言,電腦是看不懂的。那麼我們如何實現人機交流呢?這就不得不請出我們我們今天的主角人機交換的橋樑---編譯器,編譯器有很多,我們今天介紹的是一種基於 Linux 系統的 GCC 編譯器,以下程式碼都是在 Linux 系統上 VI 編輯器程式碼 GCC 編譯程式碼實現的。

 

1、GCC概述

    通常我們所寫的程式碼無論 C \ C++ 等一些高階語言其實電腦是識別不了的。程式碼只是我們程式設計師人與人之間交流的一種特殊語言 ,GCC 起初的全名是 GUN C Comlier 通俗的來說 GCC 編譯器就好比是翻譯官,把我們程式設計師寫的程式碼翻譯成電腦識別的機器語言。隨著 GCC 編譯器的功能不斷強大,支援的語言越來越多,他的名稱就變成了 GUN Comlier Collection  也稱編譯組織

,裡面包含了許多的“ 工作成員 ”,接下來我們就來看看 GCC 編譯器裡的成員( 編譯、彙編、連結 )是怎麼分工合作實現人機互動編譯的。

    

2、編譯

    什麼是編譯?我們通過在Linux終端建立一個 點C 檔案, 輸入「gcc -v -o test1 test_1.c」開啟檔案我們可以看到一堆的英文,

 

先別慌,不要覺得看不懂,我們只看有用的重點,看到白色背景的方框我們可以看見,所謂編譯就是「/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o xxx.s test_1.c」裡 cc1 把我們的  .C  輸入檔案編譯成  xxx.S  的輸出檔案

 

是不是我們每次編譯都要輸入這麼一大段的文字呢?不用,我們只要用簡潔的辦法「gcc -S」( S是大寫的 )這個命令等價於上面的那一段字母命令來輸出就可以。這樣就得到一個 xxx.s 的輸出檔案,程式碼如下圖:

這個還是我們程式設計師之間交流的另一種語言(組合語言),但是這樣的檔案計算機還是不認識,所以我們還的繼續下一步。

 

3、彙編

    所謂彙編就是把上面的 .s 作為輸入檔案從而得到 .o 輸出檔案,我們同樣也可以用簡便的命令「gcc -c」可以得到,其實這個命令是間接的呼叫實現把 .c 編到 .s 再到 .o這麼一個過程,也就是「gcc -c」就是會主動的先實現編譯

彙編,這個時候程式碼已經編譯成二進位制檔案了,如下圖:

 

哈哈哈···是不是看不懂?看不懂就對了,這是給電腦看的,但是這時候我們編譯得到一個 .o 檔案,好比一個組合機器人一樣,我們需要把一堆的器件連線起來,才能成為一個完整的機器,所以這個時候我們需要呼叫連結器來吧所有的檔案都連線起來。

 

4、連結

    什麼是連結?直接看圖:

    如圖我們可以看到,我們需要的計算機能識別執行的檔名 test1 是由「/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o test1 xxx.o」編譯出來,但是從圖中我們還可以看出,後面的 .o 檔案不止一個,而是一堆,為什麼會有一堆呢?明明我們只是編譯了一個。其實我們不用去管這一堆檔案有多少什麼個每一個是什麼意思,我們找到我們編譯的哪一個 test1.o 檔案。我們要記住的一點就是,我們可以通過連結來讓我們上面 編譯、彙編出來的檔案和其他庫檔案連起來才能使 test1 檔案執行,所以最終我們得到的計算機能識別執行的檔案是 test1 檔案,這就大功告成了。同樣的,上面的命令太長了我們用一個簡便「gcc -o」的命令來替代。

我們用 VI 編輯器寫一個C語言輸出 「hello world」的程式碼如圖:

然後通過「 gcc -o test1 test_1.c」命令編譯實現人機互動,程式碼如圖:

 

    其實 GCC 就像是一個集合,作為翻譯組織來呼叫不同工具來為他服務從而實現了人機交換的語言編譯器。由於GCC是非常智慧人性化的,很多事情都給我省了。我們寫完程式碼沒必要按照上面複雜的步驟來實現編譯,我們只要通過一個『 gcc -o 【輸出檔名】 【輸入的 .c 檔案 】』一條命令就可以一步實現人機互動。

注意:gcc 編譯對檔案字尾名很敏感,如果是編譯 C 語言必須是以 .c 為字尾的。

 

======================(完)===================