原創 by zoe.zhang
..........................................................
1. windows與Linux操作系統的不同
windows和Linux是目前來說最流行的兩大操作系統,在基本設計概念上,進程、線程、尋址、內存管理等方面都是大同小異的,但是二者之間的程序不兼容,因為二者在系統功能上是不同的,提供的系統API也是不同的。
從最明顯的幾點來說:
- 可執行文件的格式,Windows采用的是PE的格式,要求以.exe為后綴名,而Linux使用的是 elf 的格式;
- 操作系統提供的系統API是不同的,如Windows使用CreateProcess()創建進程,而Linux使用fork()。
所以想要在Windows環境下使用Linux的編譯工具,也就是gcc/g++,我們需要一個中間的轉換工具或者平台,這也就是MinGW和cygwin存在的原因。
2. 什么是 MinGW
- MinGw全稱 Minimalistic GNU for Windows,某種程度上可以看做是win版本下的GCC。Mingw有一個Msys的子項目,可以提供一些模擬Linux的shell和基本的Linux工具,Msys是一個輔助環境。
- MinGw 有專門的Win32 API的頭文件,來把代碼中Linux方式的系統調用替換為對應的Windows下的調用方式,某種程度上可以稱之為將Linux調用 翻譯為 Windows調用。
3. 什么是 cygwin
- Cygwin 則是一個在Windows平台上運行的unix模擬環境,是cygnus solutions 公司開發的自由軟件。Cygwin更像一個平台,模擬了Linux的接口,提供了運行在它上面的程序使用,提供了很多Linux環境下的GNU軟件。
- Cygwin 通過Cygwin1.dll的文件實現操作系統API的轉換,模擬了Linux的調用接口給程序,程序以Linux的方式調用系統API,但這個API的目標庫是Cygwin1.dll,Cygwin1.dll再調用Windows對用的方式實現,再把結果返回給程序。
4. 兩者的區別
- MinGW生成的程序,究其本質調用的是Kernel.32導出的標准Windows系統API,在windows下Mingw的編譯性能會高一些,編譯速度也會快一些。
- Cygwin更像一個平台,它相對完整地模擬了LInux,提供了一個接近2M的Cygwin1.dll的文件作為目標庫,來模擬Linux系統的接口,但是相對來說編譯的速度就要慢一些。如果想要在Windows上開發可以運行在LInux上的程序,應該選用Cygwin。
- 總的來說:
- cygwin大,mingw小
- cygwin編譯后的exe需要cygwin1.dll作為支持,而mingw不需要就可以直接運行,因為有中間層所以cygwin慢,mingw快。
- cygwin包含的內容更全面,能編譯通過的linux源文件更多,mingw的min是minimalist所以能編譯通過的更少。但,不是全部,就是說別指望你可以把任何為linux寫的源代碼在cygwin或mingw編譯通過並運行。
5. MinGW、MinGw-w64、TDM-GCC
- MinGW是最先出來的,但是當時只有32位系統,所以支持32位系統;
- Mingw-w64 既支持64位,也支持32位,也支持32位和64位的交叉編譯;gcc官方支持Mingw-w64,所以更建議Mingw-w64.
- TDM-GCC: 32位的用的是Mingw,64位用的是MinGW64.
- 此外還有一個IDE,CodeBlock,使用 起來相對簡單,具有較強的跨平台性,比較適合不習慣使用命令行的新手。
6. 總結
事實上,cygwin/gcc和Mingw都是為了gcc可以在windows下使用的編譯環境,可以方便進行一些類Linux環境下的編程。但是兩種平台不管是哪一種,Linux程序都不能直接運行在Windows下的,需要對程序進行重新編譯,同時建議重要的源碼還是應該在真正的Linux環境下進行編譯。
基於執行速度還有大小的原因,我傾向於在Windows下選擇使用MinGW64.
附;Mingw-w64的環境搭建
- 下載安裝包,並安裝,注意安裝時的一些setting 參數。
- 配置環境變量:環境變量輸入安裝的地址 ..\Mingw64\bin。
- 驗證配置是否成功:打開cmd命令行,輸入gcc -v。