1. 程式人生 > >Linux | GCC如何實現代碼編譯&&匯編&&鏈接過程

Linux | GCC如何實現代碼編譯&&匯編&&鏈接過程

英文 wid 二進制 xxx 特殊 ffffff 哈哈哈 需要 hello

正文:

每次我們程序員所寫的 代碼 是給程序員看的呢?還是給電腦看的?其實我們所寫的代碼只是我們程序員之間交流的一樣特殊語言,電腦是看不懂的。那麽我們如何實現人機交流呢?這就不得不請出我們我們今天的主角人機交換的橋梁---編譯器,編譯器有很多,我們今天介紹的是一種基於 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 為後綴的。

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

Linux | GCC如何實現代碼編譯&&匯編&&鏈接過程