make 是用來執行Makefile的
Makefile是類unix環境下(比如Linux)的類似于批處理的"腳本"檔案。其基本文法是: 目标+依賴+指令,隻有在目标檔案不存在,或目标比依賴的檔案更舊,指令才會被執行。由此可見,Makefile和make可适用于任意工作,不限于程式設計。比如,可以用來管理latex。
Makefile+make可了解為類unix環境下的項目管理工具,但它太基礎了,抽象程度不高,而且在windows下不太友好(針對visual studio使用者),于是就有了跨平台項目管理工具cmake
cmake是跨平台項目管理工具,它用更抽象的文法來組織項目。雖然,仍然是目标,依賴之類的東西,但更為抽象和友好,比如你可用math表示數學庫,而不需要再具體指定到底是math.dll還是libmath.so,在windows下它會支援生成visual studio的工程,在linux下它會生成Makefile,甚至它還能生成eclipse工程檔案。也就是說,從同一個抽象規則出發,它為各個編譯器定制工程檔案。
cmake是抽象層次更高的項目管理工具,cmake指令執行的CMakeLists.txt檔案
qmake是Qt專用的項目管理工具,對應的工程檔案是*.pro,在Linux下面它也會生成Makefile,當然,在指令行下才會需要手動執行qmake,完全可以在qtcreator這個專用的IDE下面打開*.pro檔案,使用qmake指令的繁瑣細節不用你管了。
總結一下,make用來執行Makefile,cmake用來執行CMakeLists.txt,qmake用來處理*.pro工程檔案。Makefile的抽象層次最低,cmake和qmake在Linux等環境下最後還是會生成一個Makefile。cmake和qmake支援跨平台,cmake的做法是生成指定編譯器的工程檔案,而qmake完全自成體系。
具體使用時,Linux下,小工程可手動寫Makefile,大工程用automake來幫你生成Makefile,要想跨平台,就用cmake。如果GUI用了Qt,也可以用qmake+*.pro來管理工程,這也是跨平台的。當然,cmake中也有針對Qt的一些規則,并代替qmake幫你将qt相關的指令整理好了。
另外,需要指出的是,make和cmake主要指令隻有一條,make用于處理Makefile,cmake用來轉譯CMakeLists.txt,而qmake是一個體系,用于支撐一個程式設計環境,它還包含除qmake之外的其它多條指令(比如uic,rcc,moc)。
上個簡圖,其中cl表示visual studio的編譯器,gcc表示linux下的編譯器
gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認為是編譯器,它可以編譯很多種程式設計語言(括C、C++、Objective-C、Fortran、Java等等)。
當你的程式隻有一個源檔案時,直接就可以用gcc指令編譯它。
.但是當你的程式包含很多個源檔案時,用gcc指令逐個去編譯時,你就很容易混亂而且工作量大
是以出現了make工具
make工具可以看成是一個智能的批處理工具,它本身并沒有編譯和連結的功能,而是用類似于批處理的方式—通過調用makefile檔案中使用者指定的指令來進行編譯和連結的。
makefile是什麼?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make工具就根據makefile中的指令進行編譯和連結的。
makefile指令中就包含了調用gcc(也可以是别的編譯器)去編譯某個源檔案的指令。
makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平台makefile又要重新修改。
這時候就出現了Cmake這個工具,cmake就可以更加簡單的生成makefile檔案給上面那個make用。當然cmake還有其他功能,就是可以跨平台生成對應平台能用的makefile,你不用再自己去修改了。
可是cmake根據什麼生成makefile呢?它又要根據一個叫CMakeLists.txt檔案(學名:組态檔)去生成makefile。
到最後CMakeLists.txt檔案誰寫啊?親,是你自己手寫的。
當然如果你用IDE,類似VS這些一般它都能幫你弄好了,你隻需要按一下那個三角形
.接着是qmake,qmake是什麼,先說一下Qt這個東西。Qt是跨平台C++圖形使用者界面應用程式開發架構。它既可以開發GUI程式,也可用于開發非GUI程式,比如控制台工具和伺服器。簡單的說就是C++的第三方庫,使用這個庫你可以很容易生成windows,Linux,MAC os等等平台的圖形界面。現在的Qt還包含了開發各種軟體一般需要用到的功能子產品(網絡,資料庫,XML,多線程啊等等),比你直接用C++(隻帶标準内褲那種)要友善和簡單。
.你可以用Qt簡簡單單就實作非常複雜的功能,是因為Qt對C++進行了擴充,你寫一行代碼,Qt在背後幫你寫了幾百上千行,而這些多出來的代碼就是靠Qt專有的moc編譯器(The Meta-Object Compiler)和uic編譯器(User Interface Complier)來重新翻譯你那一行代碼。問題來了,你在進行程式編譯前就必須先調用moc和uic對Qt源檔案進行預處理,然後再調用編譯器進行編譯。上面說的那種普通makefile檔案是不适用的,它沒辦法對qt源檔案進行預處理。是以qmake就産生了。
.qmake工具就是Qt公司制造出來,用來生成Qt 專用makefile檔案,這種makefile檔案就能自動智能調用moc和uic對源程式進行預處理和編譯。qmake當然必須也是跨平台的,跟cmake一樣能對應各種平台生成對應makefile檔案。
qmake是根據Qt 工程檔案(.pro)來生成對應的makefile的。工程檔案(.pro)相對來說比較簡單,一般工程你都可以自己手寫,但是一般都是由Qt的開發環境 Qt Creator自動生成的,你還是隻需要按下那個邪惡三角形就完事了。
還沒有完,由于qmake很簡單很好用又支援跨平台,而且是可以獨立于它的IDE,是以你也可以用在非Qt工程上面,照樣可以生成普通的makefile,隻要在pro檔案中加入CONFIG -= qt 就可以了。
這樣qmake和cmake有什麼差別?
不好意思,cmake也是同樣支援Qt程式的,cmake也能生成針對qt 程式的那種特殊makefile,
隻是cmake的CMakeLists.txt 寫起來相對與qmake的pro檔案複雜點。
qmake 是為 Qt 量身打造的,使用起來非常友善,但是cmake功能比qmake強大。
一般的Qt工程你就直接使用qmake就可以了,cmake的強大功能一般人是用不到的。
當你的工程非常大的時候,又有qt部分的子工程,又有其他語言的部分子工程,據說用cmake會 友善,我也沒試過。