gcc g 實戰之編譯的四個過程

2022-06-12 22:45:13 字數 2576 閱讀 6471

gcc和g++分別是gnu(乙個開源組織)的c&c++編譯器

對於.c字尾的檔案,gcc把它當做是c程式,g++當做是c++程式;對於.cpp字尾的檔案,gcc和g++都會當做c++程式。gcc可以根據字尾名為.c或.cpp分別按c程式和c++程式來編譯,但是g++無論是.c或.cpp都統一按c++程式來編譯。

編譯階段,g++會呼叫gcc,鏈結階段通常會用g++來完成,g++在編譯的過程中,其實是呼叫gcc按照c++程式來編譯的。即編譯工作最終都是由gcc來完成的。這是因為gcc命令不能自動和c++程式使用的庫連線。而g++則會自動呼叫鏈結的c++庫。

gcc main.cpp -lstdc++
注:main.cpp -lstdc++ 位置不能換,換了位置筆者編譯出現了 main.cpp:(.text+0x2d):undefined reference to`std::cout' 等一系列的錯誤

gcc/g++在執行編譯工作的時候,分為以下四個過程:

1.預處理,生成.i的檔案

2.將預處理後的檔案轉換成組合語言,生成.s檔案

3.彙編變為目標**(機器**)生成.o的檔案

4.連線目標**,生成可執行程式

//建個main.cpp

//this is the test code

#include

using namespace std;
#define pi 3.14

static int t = 1;

int main()

{   cout<

預處理階段。預處理器(cpp)根據以字元#開頭的命令,修改原始的c程式。比如hello.c中第一行的#include命令告訴預處理器讀取系統標頭檔案stdio.h的內容,並把它直接插入程式文字中,結果就得到了另乙個c程式,通常是以.i作為副檔名。

g++ -e main.cpp > main.i

預處理後的檔案 linux下以.i為字尾名,這個過程只啟用預處理,不生成檔案,因此你需要把它重定向到乙個輸出檔案裡 。

巨集的替換,還有注釋的消除,還有找到相關的庫檔案,將#include檔案的全部內容插入。若用<>括起檔案則在系統的include目錄中尋找檔案,若用" "括起檔案則在當前目錄中尋找檔案。

用編輯器開啟main.i會發現有很多很多**,你只需要看最後部分就會發現,預處理做了巨集的替換,還有注釋的消除,可以理解為無關**的清除。

cat main.i
下面是main.i檔案的最後部分,可以看見巨集的替換和注釋的消除。

編譯階段。編譯器(ccl)將文字檔案hello.i翻譯成文字檔案hello.s,它包含乙個組合語言程式。組合語言程式中的每條語句都以一種標準的文字格式確切的描述了一條低階機器語言指令。

g++ -s main.cpp
生成main.s檔案,.s檔案表示是彙編檔案,用編輯器開啟就都是彙編指令。

cat main.s
下面是main.s檔案的一部分:

彙編階段。彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種可重定位目標程式的格式,並將結果儲存在目標檔案hello.o中。hello.o檔案是乙個二進位制檔案,它的位元組編碼是機器語言指令而不是字元,如果我們在文字檔案中開啟hello.o檔案,看到的將是一堆亂碼。

g++ -c main.cpp
.o是gcc生成的目標檔案,用編輯器開啟就都是二進位制機器碼。

cat main.o
下面是main.o檔案的一部分:

鏈結階段。鏈結器(ld)負責處理合併目標**,生成乙個可執行目標檔案,可以被載入到記憶體中,由系統執行。

g++ main.o -o main //生成的可執行程式名為main ,如果執行命令 g++ main.o  這樣預設生成a.out,也就是main與a.out是乙個只是名字不同而已
下面是main檔案的一部分:

./main
在成功編譯之後,就進入了鏈結階段。在這裡涉及到乙個重要的概念:函式庫(可以這麼理解就是不帶main()函式的.cpp生成的)。

讀者可以重新檢視這個小程式,在這個程式中並沒有定義」cout」的函式(準確說cout不是函式,cout卻很獨特:既不是函式,似乎也不是c++特別規定出來的像if,for一類有特殊語法的「語句」,其實說到底還是函式呼叫,不過這函式有些特殊,用的是運算子過載,確切地說是過載了「<

**

程式編譯的四個過程

hello.c 源程式 是一條高階c語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體cpu直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。而我們知道,機器語言就是處理器可...

C C 程式編譯的四個過程

g 是linux下c 的編譯器 我為什麼會選擇linux下的g 編譯器,就是因為g 可以看到程式從編譯到執行的過程做了些什麼。而vs等整合開發環境看不到這些,並不是說vs工具不好,vs還是相當好用的.對於學習來說,需要知道程式從編譯到執行進行了哪些工作,做了哪些事情,首推g 編譯器 這個看個人習慣 ...

linux 編譯程式的四個過程

linux 編譯程式的過程與c c 程式編譯過程類似,只是使用的命令或實現的方法不一樣 環境平台不一樣 但是總體框架一樣。一 預編譯 命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1 將所有的 define刪除,並展開所有的巨集定義 2 處理所有的預編譯指令,...