cmake是一種跨平臺(tái)的編譯工具嗡午,比make更為高級(jí)囤躁,使用起來要方便的多。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í)就會(huì)特別麻煩婿斥,于是人們想到,為什么不設(shè)計(jì)一種類似批處理的程序哨鸭,來批處理編譯源文件呢民宿,于是就有了make工具,它是一個(gè)自動(dòng)化編譯工具像鸡,你可以使用一條命令實(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è)平臺(tái)makefile又要重新修改渴肉。
8.這時(shí)候就出現(xiàn)了Cmake這個(gè)工具,cmake就可以更加簡單的生成makefile文件給上面那個(gè)make用折柠。當(dāng)然cmake還有其他功能宾娜,就是可以跨平臺(tái)生成對(duì)應(yīng)平臺(tái)能用的makefile,你不用再自己去修改了扇售。
9.可是cmake根據(jù)什么生成makefile呢前塔?它又要根據(jù)一個(gè)叫CMakeLists.txt文件(學(xué)名:組態(tài)檔)去生成makefile。
10.到最后CMakeLists.txt文件誰寫俺斜华弓?親,是你自己手寫的困乒。
11.當(dāng)然如果你用IDE寂屏,類似VS這些一般它都能幫你弄好了,你只需要按一下那個(gè)三角形
12.cmake是make maker娜搂,生成各種可以直接控制編譯過程的控制器的配置文件迁霎,比如makefile、各種IDE的配置文件百宇。
13.make是一個(gè)簡單的通過文件時(shí)間戳控制自動(dòng)過程考廉、處理依賴關(guān)系的軟件,這個(gè)自動(dòng)過程可以是編譯一個(gè)項(xiàng)目携御。
/////////////////////////linux平臺(tái)下的編譯流程////////////////////
文本程序到可執(zhí)行文件生成無論在什么平臺(tái)大致分為以下幾個(gè)部分:?
1.用編輯器編寫源代碼昌粤,如.c文件。?
2.用編譯器編譯代碼生成目標(biāo)文件啄刹,如.o涮坐。?
3.用鏈接器連接目標(biāo)代碼生成可執(zhí)行文件,如.exe誓军。?
Linux平臺(tái)下袱讹,.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í)就會(huì)特別麻煩她肯,于是人們想到佳头,為什么不設(shè)計(jì)一種類似批處理的程序,來批處理編譯源文件呢晴氨,于是就有了make工具康嘉,它是一個(gè)自動(dòng)化編譯工具,你可以使用一條命令實(shí)現(xiàn)完全編譯籽前。但是你需要編寫一個(gè)規(guī)則文件亭珍,make依據(jù)它來批處理編譯,這個(gè)文件就是makefile枝哄,所以編寫makefile文件也是一個(gè)程序員所必備的技能肄梨。?
對(duì)于一個(gè)大工程,編寫makefile實(shí)在是件復(fù)雜的事挠锥,于是人們又想众羡,為什么不設(shè)計(jì)一個(gè)工具,讀入所有源文件之后瘪贱,自動(dòng)生成makefile呢纱控,于是就出現(xiàn)了cmake工具辆毡,它能夠輸出各種各樣的makefile或者project文件,從而幫助程序員減輕負(fù)擔(dān)菜秦。但是隨之而來也就是編寫cmakelist文件,它是cmake所依據(jù)的規(guī)則舶掖。所以在編程的世界里沒有捷徑可走球昨,還是要腳踏實(shí)地的。?
原文件—cmakelist —cmake —makefile —make —生成可執(zhí)行文件(make中則包含了多條鏈接以及gcc/g++編譯語句)眨攘。