用gcc編譯c語言程式以及其編譯過程

來源:互聯網
上載者:User

標籤:strong   class   刪除   技術分享   UI   include   read   之一   xxx   

 對於初學c語言編程的我們來說,學會如何使用gcc編譯器工具,對理解c語言的執行過程,加深對c語言的理解很重要!!!

1、先行編譯 --> 2、編譯 --> 3、彙編 --> 4、連結
-----------------------------------------------------------------------------

0、編寫c代碼,並輸入以下代碼,產生c檔案hello.c。

-----------------------------------------------------------------------------

1、先行編譯(Preprocessing)命令:

會對各種預先處理指令(#include、#define、#ifdef 等#開始的程式碼)進行處理,刪除注釋和多餘的空白字元,產生一份新的代碼。

gcc -o hello.i hello.c -E或者gcc -o hello.i -E hello.c 或者 gcc -E hello.c -o hello.i
(注意:-o 作用是指定輸出檔案的名字,如果不加-o的話,則產生的檔案名稱字總叫a.out。)

(即-o 參數:是對命令輸出結果進行匯入操作,這裡是把 gcc -E hello.c 操作結果輸出到檔案hello.i(命名可以自訂)中進行儲存。)

先行編譯hello.c,先行編譯之後得到的檔案的名字叫hello.i。

(注意:編譯後的名字可以隨意起,但是呢我們知道先行編譯後的檔案還是文本的.c檔案,所以為了好區分起名字為 xxx.c,這裡我們為了顯示整個過程,先行編譯後的檔案名稱我們起為xxx.i。)

在c語言中#開頭的語句又叫先行編譯指令。例如:#include <stdio.h>

先行編譯的功能之一:會把include包含的標頭檔內容做一個簡單的替換,即替換到.c檔案裡面去。
......
//此處省略1萬行
......
先行編譯的功能之二:會把代碼中的注釋去掉。

-----------------------------------------------------------------------------
2、編譯(Compilation)的命令:

對代碼進行文法、語義分析和錯誤判斷,產生彙編代碼檔案。

gcc -o hello.s hello.i -S 或者 gcc -o hello.s -S hello.i 或者 gcc -S hello.i -o hello.s

(-S 參數:是gcc對目標檔案進行編譯,這裡針對的是檔案hello.i檔案。)

通過這一步我們知道 C語言跟彙編的 關係,至於他們之前是如何進行轉換的,大家可以進行更深入的學習與探討。

此時目錄下多了一個hello.s檔案,內容如所示:

 

-----------------------------------------------------------------------------

3、彙編(Assembly)的命令:

把彙編代碼轉換成電腦可認識的二進位檔案,即把文本的c語言編譯為二進位指令。要知道電腦只認識0和1呢!

gcc -o hello.o hello.s -c或者gcc -o hello.o -c hello.s 或者 gcc -c hello.s -o hello.o

(-c 參數:是gcc對目標檔案執行指令轉換的操作。)

此步驟我們得到檔案hello.o檔案。

大家也同樣開啟檔案(cat hello.o)查看一下,這個檔案裡面幾乎沒幾個字元大家能看懂,這就對了,但大家可以通過這種方法將其轉化為我們可讀的形式:

[email protected]:~/2/01# readelf -a hello.o

-----------------------------------------------------------------------------
4、連結(Linking/Build)的命令:

通俗的講就是把多個*.o檔案合并成一個可執行檔,即二進位指令檔案。

gcc -o hello hello.o  或者 gcc hello.o -o hello(注意:gcc沒有單獨的連結參數)

將系統庫函數與hello.o進行連結(簡言之合并),得到可執行檔程式,該程式的名字叫hello。

[email protected]:~/2/01# gcc -o hello hello.o 

這裡我們就得到了一個可以直接在系統下執行的檔案 hello。

我們也可以對這個檔案進行readelf操作,也可以進行二進位指令轉彙編的操作,如所示:

[email protected]:~/2/01# objdump -d hello

-----------------------------------------------------------------------------

5、程式運行

我們想知道在linux系統下到底連結來了什麼庫來呢?(即可執行程式需要用到什麼庫呢?)
使用命令 ldd hello 查看。

(注意;用c語言寫的代碼依賴的庫最少,如果使用其他語言依賴的庫更多哦!!需要裝好多包包。)

 

用gcc編譯c語言程式以及其編譯過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.