g++是linux下c++的編譯器;我為什麼會選擇linux下的g++編譯器,就是因為g++可以看到程式從編譯到執行的過程做了些什麼。而vs等整合開發環境看不到這些,並不是說vs工具不好,(vs還是相當好用的...)。對於學習來說,需要知道程式從編譯到執行進行了哪些工作,做了哪些事情,首推g++編譯器(這個看個人習慣)。
一、常見檔案字尾
.c為字尾的檔案:c語言源**檔案
.a為字尾的檔案:是由目標檔案構成的庫檔案
.c,.cc為字尾的檔案:是c++源**檔案
.h為字尾的檔案:標頭檔案
o為字尾的檔案:是編譯後的目標檔案
.s為字尾的檔案:是組合語言源**檔案
.m為字尾的檔案:objective-c原始程式
.so為字尾的檔案:編譯後的動態庫檔案
二、g++執行的四個過程
1、預處理:條件編譯,標頭檔案包含,巨集替換的處理,生成.i檔案。
2、編譯:將預處理後的檔案轉換成組合語言,生成.s檔案
3、彙編:彙編變為目標**(機器**)生成.o的檔案
4、鏈結:連線目標**,生成可執行程式
三、最簡單的c++程式——"helloworld!\n"
// 新建hello.cpp檔案,vim編輯
#include
using namespace std;
int main(void)
(1)預處理階段
g++ -e hello.cpp > hello.i通過vim開啟hello.i檔案,你會發現一些情況(最好是自己觀察,看看哪些內容被換了);
巨集的替換,還有注釋的消除,還有找到相關的庫檔案,將#include檔案的全部內容插入。若用<>括起檔案則在系統的include目錄中尋找檔案,若用""括起檔案則在當前目錄中尋找檔案。
用編輯器開啟hello.i會發現有很多很多**,你只需要看最後部分就會發現,預處理做了巨集的替換,還有注釋的消除,可以理解為無關**的清除。
(2)編譯
g++ -s hello.cpp生成hello.s檔案,.s檔案表示是彙編檔案,用編輯器開啟就都是彙編指令。(可以通過vim編輯器看看hello.s裡面的內容【都是彙編指令,哈哈】)。
(3)彙編
g++ -c hello.cpp彙編變為目標**(機器**)生成.o的檔案,.o是gcc生成的目標檔案,用編輯器開啟就都是二進位制機器碼。
(4)鏈結 ——鏈結生成可執行檔案(庫檔案進行鏈結)
g++ -o hello hello.cpp程式執行:./hello【輸出hello world!】
可以重新檢視這個小程式,在這個程式中並沒有定義」cout」的函式(準確說cout不是函式,cout卻很獨特:既不是函式,似乎也不是c++特別規定出來的像if,for一類有特殊語法的「語句」,其實說到底還是函式呼叫,不過這函式有些特殊,用的是運算子過載,確切地說是過載了「<
程式編譯的四個過程
hello.c 源程式 是一條高階c語言程式,雖然它是以一種易讀的形式,讓人們容易理解。但是,它卻無法直接驅動硬體cpu直接執行。為了我們編寫的hello.c程式可以被執行,驅動硬體電路工作,hello.c程式必須經過一些列處理步驟,將源程式轉化為可執行性的目標程式。而我們知道,機器語言就是處理器可...
linux 編譯程式的四個過程
linux 編譯程式的過程與c c 程式編譯過程類似,只是使用的命令或實現的方法不一樣 環境平台不一樣 但是總體框架一樣。一 預編譯 命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1 將所有的 define刪除,並展開所有的巨集定義 2 處理所有的預編譯指令,...
linux 編譯程式的四個過程
一 預編譯 他的命令是gcc e main.c o main.o 假設當前要編譯的檔案是main.c 1.將所有的 define刪除,並展開所有的巨集定義 2.處理所有的預編譯指令,例如 if,elif,else,endif 3.處理 include預編譯指令,將被包含的檔案插入到預編譯指令的位置 ...