cmake nmake qmake 的區別聯繫

來自:知乎,作者:輝常哥

鏈接:https://www.zhihu.com/question/27455963/answer/89770919

經常記不住這幾個概念,都看了幾次了還是容易忘,爲以後方面查閱,故而從知乎上覆制粘貼過來。

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

2、當你的程序只有一個源文件時,直接就可以用 gcc 命令編譯它。

3、但是當你的程序包含很多個源文件時,用 gcc 命令逐個去編譯時,你就很容易混亂而且工作量大

4、所以出現了 make 工具
make 工具可以看成是一個智能的批處理工具,它本身並沒有編譯和鏈接的功能,而是用類似於批處理的方式—通過調用 makefile 文件中用戶指定的命令來進行編譯和鏈接的。

5、makefile 是什麼?簡單的說就像一首歌的樂譜,make 工具就像指揮家,指揮家根據樂譜指揮整個樂團怎麼樣演奏,make 工具就根據 makefile 中的命令進行編譯和鏈接的。

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

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

8、這時候就出現了 Cmake 這個工具,cmake 就可以更加簡單的生成 makefile 文件給上面那個 make 用。當然 cmake 還有其他功能,就是可以跨平臺生成對應平臺能用的 makefile,你不用再自己去修改了。

9、可是 cmake 根據什麼生成 makefile 呢?它又要根據一個叫 CMakeLists.txt 文件(學名:組態檔)去生成 makefile。

10、到最後 CMakeLists.txt 文件誰寫啊?親,是你自己手寫的。

11、當然如果你用 IDE,類似 VS 這些一般它都能幫你弄好了,你只需要按一下那個三角形

12、接着是 qmake,qmake 是什麼,先說一下 Qt 這個東西。Qt 是跨平臺 C++ 圖形用戶界面應用程序開發框架。它既可以開發 GUI 程序,也可用於開發非 GUI 程序,比如控制檯工具和服務器。簡單的說就是 C++ 的第三方庫,使用這個庫你可以很容易生成 windows,Linux,MAC os 等等平臺的圖形界面。現在的 Qt 還包含了開發各種軟件一般需要用到的功能模塊(網絡,數據庫,XML,多線程啊等等),比你直接用 C++(只帶標準內褲那種)要方便和簡單。

13、你可以用 Qt 簡簡單單就實現非常複雜的功能,是因爲 Qt 對 C++ 進行了擴展,你寫一行代碼,Qt 在背後幫你寫了幾百上千行,而這些多出來的代碼就是靠 Qt 專有的 moc 編譯器(The Meta-Object Compiler)和 uic 編譯器(User Interface Complier)來重新翻譯你那一行代碼。問題來了,你在進行程序編譯前就必須先調用 moc 和 uic 對 Qt 源文件進行預處理,然後再調用編譯器進行編譯。上面說的那種普通 makefile 文件是不適用的,它沒辦法對 qt 源文件進行預處理。所以 qmake 就產生了。

14、qmake 工具就是 Qt 公司製造出來,用來生成 Qt 專用 makefile 文件,這種 makefile 文件就能自動智能調用 moc 和 uic 對源程序進行預處理和編譯。qmake 當然必須也是跨平臺的,跟 cmake 一樣能對應各種平臺生成對應 makefile 文件。

15、qmake 是根據 Qt 工程文件(.pro)來生成對應的 makefile 的。工程文件(.pro)相對來說比較簡單,一般工程你都可以自己手寫,但是一般都是由 Qt 的開發環境 Qt Creator 自動生成的,你還是隻需要按下那個邪惡三角形就完事了。

16、還沒有完,由於 qmake 很簡單很好用又支持跨平臺,而且是可以獨立於它的 IDE,所以你也可以用在非 Qt 工程上面,照樣可以生成普通的 makefile,只要在 pro 文件中加入 CONFIG -= qt 就可以了。

17、 這樣 qmake 和 cmake 有什麼區別?
不好意思,cmake 也是同樣支持 Qt 程序的,cmake 也能生成針對 qt 程序的那種特殊 makefile,
只是 cmake 的 CMakeLists.txt 寫起來相對與 qmake 的 pro 文件複雜點。
qmake 是爲 Qt 量身打造的,使用起來非常方便,但是 cmake 功能比 qmake 強大。
一般的 Qt 工程你就直接使用 qmake 就可以了,cmake 的強大功能一般人是用不到的。

當你的工程非常大的時候,又有 qt 部分的子工程,又有其他語言的部分子工程,據說用 cmake 會 方便,我也沒試過。

qmake 和 nmake

2012 年 04 月 11 日 14:34:09 congwulong 閱讀數 3230

<<<<<<<<<<<<<<<<<<<<<<<<qmake 是做什麼的?
qmake 是用來生成 makefile 的。
makefile 是幹嘛的?
makefile 裏記錄了工程中的所有文件,編譯器編譯時根據 makefile 文件來進行編譯。
qmake 怎麼生成 makefile?
它基於項目文件來生成,(.pro 文件) 項目文件由開發者創建。
如果是在 windows 下使用 VS 開發,首先要把 qmake 的環境變量設置爲 win32-msvc。
pro 文件用來告訴 qmake 如何生成 makefile。如該項目有哪些源文件和頭文件,該應用程序的特定配置,比如需要鏈接的額外的庫,
或者一個額外的包含路徑,這些都應該放在項目文件中。
總結:手寫 makefile 文件比較困難而且容易出錯,使用 qmake,開發者只需要創建一個簡單的項目文件,再運行
qmake 就可以生成適當的 makefile 了。
 
<<<<<<<<<<<<<<<<<<<<<<<<nmake 是做什麼的?
它處理 makefile 文件,解釋裏邊的語句並執行相應的指令。
調用 NMAKE 時,它會檢查所有相關的文件,如果目標文件的時間戳小於依賴文件的,那 nmake 就執行該依賴關係相關聯的操作。
舉例說明:
foo.exe : first.obj  second.obj
link first.obj, second.obj
第一行定義了依賴關係;第二行給出了該依賴關係相關聯的操作。
如果 first.obj 和 second.obj 任何一個修改了,那就得調用 link.exe,重新鏈接生成 foo.exe。
這就是 nmake 的執行邏輯。

<<<<<<<<<<<<<<<<<<<<<<<<makefile 的語法
略...

總結:nmake 就相當於一個解釋程序,makefile 是一個編程語言,寫的程序 (makefile 文件) 由 nmake 來解釋執行

make-makefile -- cmake nmake qmake 的區別聯繫

2018 年 04 月 20 日 10:13:10 決戰小樹林 閱讀數 182

一、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 完全自成體系。nmake 一般用於 windows 系統 vs 的編譯。

cmake\qmake -- 跨平臺 -- 生成 MakeFile

nmake -- windows vs -- 生成 MakeFile

make -- MakeFile

個人總結,有什麼不對的地方還望指正,謝謝!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/4FS4hhObyEMJYBDYEyGqYw