標籤: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語言程式以及其編譯過程