天天看點

弄懂gcc g++ make cmake含義與差別

一、什麼是GCC

首先介紹一下GCC:GNU Compiler Collection(GNU 編譯器集合),在為Linux開發應用程式時,絕大多數情況下使用的都是C語言,是以幾乎每一位Linux程式員面臨的首要問題都是如何靈活運用C編譯器。目前 Linux下最常用的C語言編譯器是GCC(GNU Compiler Collection),它是GNU項目中符合ANSI C标準的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程式。GCC不僅功能非常強大,結構也異常靈活。最值得稱道的一點就是它可以通過不同的前端子產品來支援各種語言,如Java、 Fortran、Pascal、Modula-3和Ada等。

弄懂gcc g++ make cmake含義與差別

gcc與g++差別:

1、gcc 和 g++都是GNU(組織)的一個編譯器

2、gcc是GCC中的GUNC Compiler(C 編譯器)

3、g++是GCC中的GUN C++ Compiler(C++編譯器)

4、更準确的說法是:gcc調用了Ccompiler,而g++調用了C++ compiler

5、對于 *.c和*.cpp檔案,gcc分别當做c和cpp檔案編譯(c和cpp的文法強度是不一樣的); g++則統一當做cpp檔案編譯

gcc與g++的安裝:

弄懂gcc g++ make cmake含義與差別

gcc 安裝完畢之後,可以檢視版本:

我安裝的為gcc /g++ 7.5.0

弄懂gcc g++ make cmake含義與差別

二、GCC/G++工作流程

GCC 編譯器對程式的編譯下圖所示,分為 4 個階段:預處理(預編譯)、編譯和優化、彙編和連結。GCC 的編譯器可以将這 4 個步驟合并成一個。先介紹一個每個步驟都分别做了寫什麼事兒:

預處理:在這個階段主要做了三件事: 展開頭檔案 、宏替換 、去掉注釋行

這個階段需要 GCC 調用預處理器來完成,最終得到的還是源檔案,文本格式

編譯:這個階段需要 GCC 調用編譯器對檔案進行編譯,最終得到一個彙編檔案

彙編:這個階段需要 GCC 調用彙編器對檔案進行彙編,最終得到一個二進制檔案

連結:這個階段需要 GCC 調用連結器對程式需要調用的庫進行連結,最終得到一個可執行的二進制檔案

弄懂gcc g++ make cmake含義與差別

編譯參數

弄懂gcc g++ make cmake含義與差別

編譯流程

g++ 編譯示例

源碼

弄懂gcc g++ make cmake含義與差別

第一步:對源檔案進行預處理,需要使用的 gcc 參數為 -E

弄懂gcc g++ make cmake含義與差別

第二步:編譯預處理之後的檔案,需要使用的 gcc 參數為 -S

弄懂gcc g++ make cmake含義與差別

第三步:對得到的彙編檔案進行彙編,需要使用的 gcc 參數為 -c

弄懂gcc g++ make cmake含義與差別

第四步:将得到的二進制檔案和标準庫進制連結,得到可執行的二進制檔案,不需要任何參數

弄懂gcc g++ make cmake含義與差別

第五步:運作

弄懂gcc g++ make cmake含義與差別

最後再次強調,在使用 gcc 編譯程式的時候可以通過參數控制内部自動執行幾個步驟:(指令:gcc/g++ xxx.cpp -o xxxexe)

弄懂gcc g++ make cmake含義與差別

三、cmake與make差別

當你的程式隻有一個源檔案時,直接就可以用gcc指令編譯它。但是當你的程式包含很多個源檔案時,用gcc指令逐個去編譯時,你就很容易混亂而且工作量大。

弄懂gcc g++ make cmake含義與差別

什麼是make?

是以出現了make工具!make工具可以看成是一個智能的批處理工具,它本身并沒有編譯和連結的功能,而是用類似于批處理的方式—通過調用makefile檔案中使用者指定的指令來進行編譯和連結的。

makefile是什麼?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make工具就根據makefile中的指令進行編譯和連結的。makefile指令中就包含了調用gcc(也可以是别的編譯器)去編譯某個源檔案的指令。

什麼是cmake?

makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平台makefile又要重新修改。

這時候就出現了CMake這個工具,cmake就可以更加簡單的生成makefile檔案給上面那個make用。當然cmake還有其他功能,就是可以跨平台生成對應平台能用的makefile,你不用再自己去修改了。可是cmake根據什麼生成makefile呢?那就是CMakeLists.txt檔案。

最簡單的CMakeLists.txt:

弄懂gcc g++ make cmake含義與差別
弄懂gcc g++ make cmake含義與差別

cmake make編譯流程圖

弄懂gcc g++ make cmake含義與差別

繼續閱讀