作者:玟清 鏈接:https://www.php.cn/link/bf9b5a850f9afd054eb3bcd288c246c9 來(lái)源:知乎 著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。
- make 用于執(zhí)行Makefile文件。 2. Makefile 是類unix環(huán)境(如Linux)下的一種類似批處理的“腳本”文件。其基本語(yǔ)法包括目標(biāo)、依賴和命令,只有當(dāng)目標(biāo)文件不存在或比依賴文件更新時(shí),命令才會(huì)執(zhí)行。由此可見(jiàn),Makefile 和 make 可用于任何工作,不僅限于編程,例如可以用來(lái)管理LaTeX。 3. Makefile 和 make 可以視為類Unix環(huán)境下的項(xiàng)目管理工具,但其抽象程度較低,且在Windows下對(duì)visual studio用戶不友好,因此出現(xiàn)了跨平臺(tái)項(xiàng)目管理工具cmake。 4. cmake 是跨平臺(tái)項(xiàng)目管理工具,它使用更抽象的語(yǔ)法來(lái)組織項(xiàng)目。雖然仍然包括目標(biāo)和依賴等概念,但更為抽象和友好。例如,你可以使用“math”表示數(shù)學(xué)庫(kù),而無(wú)需具體指定是math.dll還是libmath.so。在Windows下,它可以生成Visual Studio工程文件,在Linux下生成Makefile,甚至可以生成eclipse工程文件。也就是說(shuō),從同一個(gè)抽象規(guī)則出發(fā),它為各個(gè)編譯器定制工程文件。 5. cmake 是更高抽象層次的項(xiàng)目管理工具,執(zhí)行的文件是CMakeLists.txt。 6. qmake 是qt專用的項(xiàng)目管理工具,對(duì)應(yīng)的工程文件是.pro。在Linux下,它也會(huì)生成Makefile,當(dāng)然,在命令行下需要手動(dòng)執(zhí)行qmake,但在Qt Creator這個(gè)專用ide中打開(kāi).pro文件時(shí),不需要手動(dòng)處理qmake的繁瑣細(xì)節(jié)。 總結(jié)一下,make 用于執(zhí)行Makefile,cmake 用于執(zhí)行CMakeLists.txt,qmake 用于處理.pro工程文件。Makefile的抽象層次最低,cmake 和 qmake 在Linux等環(huán)境下最終還是會(huì)生成一個(gè)Makefile。cmake 和 qmake 支持跨平臺(tái),cmake 通過(guò)生成指定編譯器的工程文件實(shí)現(xiàn)跨平臺(tái),而qmake 則自成體系。具體使用時(shí),在Linux下,小型工程可以手動(dòng)編寫(xiě)Makefile,大型工程可以使用automake生成Makefile,要實(shí)現(xiàn)跨平臺(tái),可以使用cmake。如果GUI使用了Qt,也可以使用qmake + .pro來(lái)管理工程,這也是跨平臺(tái)的。當(dāng)然,cmake 中也有針對(duì)Qt的一些規(guī)則,并替代qmake處理Qt相關(guān)的命令。另外,需要指出的是,make 和 cmake 的主要命令只有一條,make 用于處理Makefile,cmake 用于轉(zhuǎn)譯CMakeLists.txt,而qmake 是一個(gè)體系,用于支撐一個(gè)編程環(huán)境,它還包含除qmake 之外的其他多條命令(如uic、rcc、moc)。
上個(gè)簡(jiǎn)圖,其中cl表示Visual Studio的編譯器,gcc表示Linux下的編譯器
作者:輝常哥 鏈接:https://www.php.cn/link/ce3f64221a4fbc9ed30d001c572bc5a3 來(lái)源:知乎 著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)。
- gcc 是gnu Compiler Collection(GNU編譯器套件),也可以簡(jiǎn)單認(rèn)為是編譯器,它可以編譯多種編程語(yǔ)言(包括C、c++、Objective-C、Fortran、Java等)。 2. 當(dāng)你的程序只有一個(gè)源文件時(shí),可以直接使用gcc命令編譯它。 3. 但是當(dāng)你的程序包含多個(gè)源文件時(shí),使用gcc命令逐個(gè)編譯會(huì)很容易混亂且工作量大。 4. 因此出現(xiàn)了make工具。make工具可以視為一個(gè)智能的批處理工具,它本身不具備編譯和鏈接功能,而是通過(guò)調(diào)用makefile文件中用戶指定的命令來(lái)進(jìn)行編譯和鏈接。 5. makefile是什么?簡(jiǎn)單來(lái)說(shuō),就像一首歌的樂(lè)譜,make工具就像指揮家,指揮家根據(jù)樂(lè)譜指揮整個(gè)樂(lè)團(tuán)如何演奏,make工具就根據(jù)makefile中的命令進(jìn)行編譯和鏈接。 6. makefile命令中就包含了調(diào)用gcc(也可以是其他編譯器)去編譯某個(gè)源文件的命令。 7. 在一些簡(jiǎn)單的工程中,makefile完全可以手動(dòng)編寫(xiě),但當(dāng)工程非常大時(shí),手寫(xiě)makefile也非常麻煩,如果換了平臺(tái),makefile又需要重新修改。 8. 這時(shí)就出現(xiàn)了cmake工具,cmake可以更簡(jiǎn)單地生成makefile文件供make使用。當(dāng)然,cmake還有其他功能,可以跨平臺(tái)生成對(duì)應(yīng)平臺(tái)可用的makefile,無(wú)需再手動(dòng)修改。 9. 但是cmake根據(jù)什么生成makefile呢?它需要根據(jù)一個(gè)名為CMakeLists.txt的文件(學(xué)名:配置文件)來(lái)生成makefile。 10. 那么CMakeLists.txt文件由誰(shuí)編寫(xiě)呢?當(dāng)然是你自己手寫(xiě)的。 11. 如果你使用IDE,如Visual Studio,通常它都能幫你處理好,你只需點(diǎn)擊那個(gè)三角形按鈕。 12. 接下來(lái)是qmake,qmake是什么?先說(shuō)一下Qt這個(gè)東西。Qt是跨平臺(tái)的C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可以用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。簡(jiǎn)單來(lái)說(shuō),就是C++的第三方庫(kù),使用這個(gè)庫(kù)你可以很容易生成Windows、Linux、Mac OS等平臺(tái)的圖形界面。現(xiàn)在的Qt還包含了開(kāi)發(fā)各種軟件通常需要用到的功能模塊(如網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、xml、多線程等),比直接使用C++(只帶標(biāo)準(zhǔn)庫(kù)的那種)要方便和簡(jiǎn)單。 13. 你可以用Qt輕松實(shí)現(xiàn)非常復(fù)雜的功能,是因?yàn)镼t對(duì)C++進(jìn)行了擴(kuò)展,你寫(xiě)一行代碼,Qt在背后幫你寫(xiě)了幾百上千行,而這些額外的代碼就是靠Qt專有的moc編譯器(元對(duì)象編譯器)和uic編譯器(用戶界面編譯器)來(lái)重新翻譯你那一行代碼。問(wèn)題來(lái)了,在程序編譯前必須先調(diào)用moc和uic對(duì)Qt源文件進(jìn)行預(yù)處理,然后再調(diào)用編譯器進(jìn)行編譯。普通的makefile文件不適用,因?yàn)樗鼰o(wú)法對(duì)Qt源文件進(jìn)行預(yù)處理。因此,qmake就出現(xiàn)了。 14. qmake工具是由Qt公司開(kāi)發(fā),用來(lái)生成Qt專用的makefile文件,這種makefile文件可以自動(dòng)智能調(diào)用moc和uic對(duì)源程序進(jìn)行預(yù)處理和編譯。qmake當(dāng)然也必須是跨平臺(tái)的,像cmake一樣可以對(duì)應(yīng)各種平臺(tái)生成對(duì)應(yīng)的makefile文件。 15. qmake是根據(jù)Qt工程文件(.pro)來(lái)生成對(duì)應(yīng)的makefile的。工程文件(.pro)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,一般工程你都可以自己手寫(xiě),但通常都是由Qt的開(kāi)發(fā)環(huán)境Qt Creator自動(dòng)生成的,你只需點(diǎn)擊那個(gè)邪惡的三角形按鈕就完成了。 16. 還沒(méi)有完,由于qmake非常簡(jiǎn)單好用且支持跨平臺(tái),而且可以獨(dú)立于它的IDE,所以你也可以將其用于非Qt工程,照樣可以生成普通的makefile,只需在pro文件中加入CONFIG -= qt即可。 17. 那么qmake和cmake有什么區(qū)別呢?不好意思,cmake同樣支持Qt程序,cmake也能生成針對(duì)Qt程序的特殊makefile,只是cmake的CMakeLists.txt編寫(xiě)起來(lái)比qmake的pro文件復(fù)雜一些。qmake是為Qt量身打造的,使用起來(lái)非常方便,但cmake的功能比qmake強(qiáng)大。一般的Qt工程你就直接使用qmake就可以了,cmake的強(qiáng)大功能一般人是用不到的。當(dāng)你的工程非常大時(shí),又有Qt部分的子工程,又有其他語(yǔ)言的部分子工程,據(jù)說(shuō)使用cmake會(huì)更方便,但我也沒(méi)試過(guò)。