gcc、make、cmake、qmake、make install這么多的make都干了什么

cmake是一種跨平臺的編譯工具,比make更為高級,使用起來要方便的多。cmake主要是編寫了cmakelists.txt文件,然后用cmake命令將cmakelists.txt文件轉(zhuǎn)化成make所需要的makefile文件,最后用make命令編譯源碼生成可執(zhí)行程序或者共享庫(so(shared object))。它的作用和qt的qmake是相似的。

可以如下圖理解:

configure(配置編譯環(huán)境)

cmake=qmake(生成makefile)

make(從makefile中讀取指令,然后編譯)

make install(從makefile中讀取指令,安裝程序)



那gcc/g++在這個(gè)過程中干了什么呢

我們知道編譯和鏈接階段是靠g++和gcc編輯器來完成,但是如果編譯和鏈接的階段如果源文件太多,一個(gè)一個(gè)編譯時(shí)就會特別麻煩,于是人們想到,為什么不設(shè)計(jì)一種類似批處理的程序,來批處理編譯源文件呢,于是就有了make工具,它是一個(gè)自動化編譯工具,你可以使用一條命令實(shí)現(xiàn)完全編譯。但是你需要編寫一個(gè)規(guī)則文件,make依據(jù)它來批處理編譯,這個(gè)文件就是makefile。

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

///////////////////////////////////////////////詳細(xì)過程///////////////////////////////////////////////////////////////////


1.gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認(rèn)為是編譯器,它可以編譯很多種編程語言(括C、C++、Objective-C、Fortran、Java等等)。

2.當(dāng)你的程序只有一個(gè)源文件時(shí),直接就可以用gcc命令編譯它。

3.但是當(dāng)你的程序包含很多個(gè)源文件時(shí),用gcc命令逐個(gè)去編譯時(shí),你就很容易混亂而且工作量大

4.所以出現(xiàn)了make工具

make工具可以看成是一個(gè)智能的批處理工具,它本身并沒有編譯和鏈接的功能,而是用類似于批處理的方式—通過調(diào)用makefile文件中用戶指定的命令來進(jìn)行編譯和鏈接的。

5.makefile是什么?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據(jù)樂譜指揮整個(gè)樂團(tuán)怎么樣演奏,make工具就根據(jù)makefile中的命令進(jìn)行編譯和鏈接的。

6.makefile命令中就包含了調(diào)用gcc(也可以是別的編譯器)去編譯某個(gè)源文件的命令。

7.makefile在一些簡單的工程完全可以人工手下,但是當(dāng)工程非常大的時(shí)候,手寫makefile也是非常麻煩的,如果換了個(gè)平臺makefile又要重新修改。

8.這時(shí)候就出現(xiàn)了Cmake這個(gè)工具,cmake就可以更加簡單的生成makefile文件給上面那個(gè)make用。當(dāng)然cmake還有其他功能,就是可以跨平臺生成對應(yīng)平臺能用的makefile,你不用再自己去修改了。

9.可是cmake根據(jù)什么生成makefile呢?它又要根據(jù)一個(gè)叫CMakeLists.txt文件(學(xué)名:組態(tài)檔)去生成makefile。

10.到最后CMakeLists.txt文件誰寫?。坑H,是你自己手寫的。

11.當(dāng)然如果你用IDE,類似VS這些一般它都能幫你弄好了,你只需要按一下那個(gè)三角形

12.cmake是make maker,生成各種可以直接控制編譯過程的控制器的配置文件,比如makefile、各種IDE的配置文件。

13.make是一個(gè)簡單的通過文件時(shí)間戳控制自動過程、處理依賴關(guān)系的軟件,這個(gè)自動過程可以是編譯一個(gè)項(xiàng)目。

/////////////////////////linux平臺下的編譯流程////////////////////

  文本程序到可執(zhí)行文件生成無論在什么平臺大致分為以下幾個(gè)部分:?

  1.用編輯器編寫源代碼,如.c文件。?

  2.用編譯器編譯代碼生成目標(biāo)文件,如.o。?

  3.用鏈接器連接目標(biāo)代碼生成可執(zhí)行文件,如.exe。?

  Linux平臺下,.o文件一般是通過編譯的但還未鏈接的目標(biāo)文件,.out文件一般都是經(jīng)過相應(yīng)的鏈接產(chǎn)生的可執(zhí)行文件(linux下)。當(dāng)然這是一般情況下人們這么設(shè)置,而真正的,在linux中 .o通常保存的是可執(zhí)行代碼 ,至于可執(zhí)行文件則沒有規(guī)定擴(kuò)展名,用的是文件屬性位來決定的是否可執(zhí)行。在chmod中設(shè)置。?

  我們知道編譯和鏈接階段是靠g++和gcc編輯器來完成,這兩個(gè)編譯階段是相同的,但是鏈接階段g++默認(rèn)鏈接c++庫,所以一般情況下用gcc編譯c文件,而g++編譯cpp文件。當(dāng)然g++也可以編譯c文件,而gcc編譯cpp文件則需要在后面加上參數(shù)-lstdc++,作用就是鏈接c++庫。?

  但是如果編譯和鏈接的階段如果源文件太多,一個(gè)一個(gè)編譯時(shí)就會特別麻煩,于是人們想到,為什么不設(shè)計(jì)一種類似批處理的程序,來批處理編譯源文件呢,于是就有了make工具,它是一個(gè)自動化編譯工具,你可以使用一條命令實(shí)現(xiàn)完全編譯。但是你需要編寫一個(gè)規(guī)則文件,make依據(jù)它來批處理編譯,這個(gè)文件就是makefile,所以編寫makefile文件也是一個(gè)程序員所必備的技能。?

  對于一個(gè)大工程,編寫makefile實(shí)在是件復(fù)雜的事,于是人們又想,為什么不設(shè)計(jì)一個(gè)工具,讀入所有源文件之后,自動生成makefile呢,于是就出現(xiàn)了cmake工具,它能夠輸出各種各樣的makefile或者project文件,從而幫助程序員減輕負(fù)擔(dān)。但是隨之而來也就是編寫cmakelist文件,它是cmake所依據(jù)的規(guī)則。所以在編程的世界里沒有捷徑可走,還是要腳踏實(shí)地的。?

  原文件—cmakelist —cmake —makefile —make —生成可執(zhí)行文件(make中則包含了多條鏈接以及gcc/g++編譯語句)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容