2013-08-02 44 views
16

道歉,如果這是一個相當愚蠢的問題,但我正在努力讓NetBeans中的C++設置(它需要MinGW)。它在NetBeans的C/C++部分的文檔中說,它只能用於MSYS的make,而不是MinGW的make。我想知道這兩者之間的差異,所以我谷歌搜索它,並提出了this question其中說有MinGW,mingw32-make(MinGW的品牌)和make(MSYS的品牌)包括兩種不同的產品。然後我挖一點就MinGW的網站的wiki,發現這個帖子埋在FAQ:MinGW的品牌和MSYS的品牌有什麼區別,哪一個可以在哪裏?

的「原生」(即:MSVCRT依賴)製作的端口是缺乏一些 功能和已修改的功能,由於在Win32上缺少POSIX 。在MSYS發行版 中還存在一個取決於MSYS運行時的make版本。這個端口的運行更多,因爲製造 的目的是操作,並在執行過程中減少頭痛。 基於此,MinGW開發人員/維護人員/打包人員決定, 將最好重命名本地版本,以便「原生」版本和MSYS版本可以同時存在,而不存在 文件名衝突。

因此,如果有兩個副本的make,哪一個在MSYS shell中可用,哪一個可用於cmd.exe?這兩者之間的主要區別是什麼?

回答

14

兩者之間的主要實際區別是,MSYS版本和本地版本是前者使用MSYS shell執行其命令,而後者使用cmd。這意味着使用MSYS版本的make可以在Unix或Linux系統上編寫食譜,而在本地Windows版本中,您可能需要以不同的方式做事。對於簡單的命令執行,它們的工作方式是相同的,但對於更復雜的操作,配方將不得不有所不同,因爲cmd與Unix shell有很多不同的語法。

例如,你可能會處理遞歸構建這樣與MSYS使:

recurse-subdirs: 
    for i in $(SUBDIRS);   \ 
    do        \ 
     cd $$i && make all || exit; \ 
    done 

雖然有化妝的原生版本,你不得不做這樣的事情,而不是:

recurse-subdirs: FORCE 
    for %%i in ($(SUBDIRS)) do  \ 
     cd %%i && make all || exit 

隨着MSYS使得它可以安全地假設通常的Unix命令可用(例如,rm *.o),而使用本機可以使用Windows命令(例如del *.o)。

哪個版本的make可用取決於您如何設置PATH。如果可以通過搜索PATH找到兩個版本的make,其中一個名爲make,另一個名爲mingw32-make,則可以使用這兩個命令。無論您使用的是MSYS shell還是cmd,都是如此。

相關問題