windows下的GNU編譯環境Cygwin和MinGW


一般我們開發windows下的程序都是使用VC,VS這樣的可視集成化的IDE,但是有很多開源軟件例如mplayer,vlc等為了保持程序的跨平台性,通常都會選擇使用GUN標准進行開發,linux環境下GUU編譯工具一般都是gcc,g++等。而到了windows平台上,我們也可以選擇Cygwin或者Msys+MingW等編譯器進行開發。下面是特酷吧在學習中整理的資料。

Cygwin

Cygwin是一些自由軟件的集合,所謂的Cygwin的官方解釋是:GUN + Cygnus + windows = cygwin。Cygnus最初的時候是把gcc,gdb等這些linux平台下的編譯調試等工具進行改造,使他們能夠配合生成win32格式的目標文件。為了節省開發工作,他們編寫了一個共享庫cygwin.dll,這個庫里集成了win32.api中沒有的unix風格的調用,也就是編寫了一個unix系統的模擬層。Cygwin包含了一套庫,該庫允許在win32環境中實現POSIX系統調用的API並有一套GUN開發工具集。它由兩部分組成。一個是核心的cygwin1.dll,這個dll以windows的api實現了Linux下的大部分API。另一個部分則是newlib,實際上就是glibc,它將調用cygwin1.dll中的實現,然后以glibc的形式呈現給用戶使用。它但一個很大的缺點是Cygwin不支持Unicode。Cygwin的安裝非常簡單,到http://www.cygwin.com/下載安裝文件,直接在windows下安裝即可。配置好環境之后,就可以和linux一樣在終端界面使用Cygwin了。

MingW+Msys

該組合在網絡上評價很高,特酷吧查詢到的結果是,很多人都認為Msys+MingW比Cygwin小巧且效率高。特酷吧認為Msys+MingW是早些年的說法,現在只要安裝MingW,再安裝軟件的時候就會讓你選擇是否需要安裝Msys,如果選中的話,則Msys會繼承到MingW中,安裝完成以后在mingW shell中就可以編譯程序,類似liunx的終端。

Msys的全稱是“Minimal GNU(POSIX)system on Windows”,是一個小型的GNU環境,包括基本的bash,make等等。是Windows下最優秀的GNU環境,特酷吧認為他就是模擬linux系統的一個集成環境包,當然不具備編譯功能,編譯功能由MingW實現。

MingW,即 Minimalist GNU For Windows。它是一些頭文件和庫的集合,該集合允許人們在沒有第三方動態鏈接庫的情況下使用GCC產生 Windows32程序。開發MinGW是為了那些不喜歡工作在 Linux(FreeBSD) 操作系統而留在 Windows 的人提供一套符合GNU的GNU工作環境(據說Cygwin是有版權的)。

Msys+MingGW他們結合就組成了一個在windows下的類似linux系統的終端環境,在該環境下可以使用一些linux命令,還可以編譯程序。

工程地址:http://www.mingw.org/

MingW的安裝配置

http://sourceforge.net/projects/mingw/files/latest/download下載類似mingw-get-inst-20120426的文件,點擊安裝則會選擇要安裝的編譯器以及Msys系統數據庫(已經集成了MingW),一般做c/c++開發需要選中C Compiler、C++ Compiler、MSYS Basic System ,選上之后,安裝程序會他通過網絡安裝好所有需要的文件,很方便。

安裝完成之后,最好設置一下環境變量:

我的電腦屬性,選擇“高級”選項卡。點擊“環境變量”按鈕。

點擊“新建(W)”,新建環境變量:MINGW_HOME,變量值為你剛才安裝MinGW的安裝目錄。

選擇環境變量Path,點擊“編輯"。在尾部加入“;%MINGW_HOME%\bin”。

完成之后再cmd下輸入gcc -v和g++ -v如果出現mingw的版本信息則說明安裝成功,以后我們就可以使用mingW shell進行類似linux下的編譯操作。

對於這兩個軟件特酷吧常用的就是MingW。

MingW和Cygwin的區別:

可以參考:http://hi.baidu.com/ooxxer/item/d25dccc072846a50ac00ef7e  特酷吧在此引用如下:

(1)首先明確的是MingW和cygwin都可以用來跨平台開發。 

MinGW是Minimalistic GNU for Windows的縮寫,也就是Win版的GCC[只是一個編譯工具,Msys是對MinGW的輔助]。 

Cygwin則是全面模擬了Linux的接口,提供給運行在它上面的的程序使用,並提供了大量現成的軟件,更像是一個平台。 

相對的MingW也有一個叫MSys(Minimal SYStem)的子項目,主要是提供了一個模擬Linux的Shell和一些基本的Linux工具。因為編譯一個大型程序,光靠一個GCC是不夠的,還需要有Autoconf等工具來配置項目,所以一般在Windows下編譯ffmpeg等Linux下的大型項目都是通過Msys來完成的,當然Msys只是一個輔助環境,根本的工作還是MingW來做的。

(2)用MingW和cygwin編譯出來的程序的區別 

首先MingW和cygwin都不能讓Linux下的程序直接運行在Windows上,必需通過源代碼重新編譯。 

現代操作系統包括Windows和Linux的基本設計概念像進程線程地址空間虛擬內存這些都是大同小異的,之所以二者上的程序不能兼容,主要是它們對這些功能具體實現上的差異,首先是可執行文件的格式,Window使用PE的格式,並且要求以.EXE為后綴名。Linux則使用Elf。其次操作系統的API也不一樣,如Windows用CreateProcess()創建進程,而Linux使用fork()。  所以要移植程序必然要在這些地方進行改變,MingW有專門的W32api頭文件,來把代碼中Linux方式的系統調用替換為對應的Windows方式。而Cygwin則通過cygwin1.dll這個文件來實現這種API的轉換,並模擬一個Linux系統調用接口給程序,程序依然以Linux的方式調用系統API,只不過這個API在cygwin1.dll上,cygwin1.dll再調用Windows對應的實現,來把結果返回給程序。  可以用查看他們編譯好的程序的導入表來驗證這點。 

二者生成的程序都是能在Windows上運行的EXE文件,顯然都是PE格式,用一個PE格式查看工具檢查一下就能發現,Cygwin生成的程序依然有fork()這樣的Linux系統調用,但目標庫是cygwin1。而MingW生成的程序,則全部使用從KERNEL32導出的標准Windows系統API。 

這樣看來用Mingw編譯的程序性能會高一點,而且也不用帶着那個接近兩兆的cygwin1.dll文件。  但Cygwin對Linux的模擬比較完整,甚至有一個Cygwin X的項目,可以直接用Cygwin跑X。 

另外Cygwin可以設置-mno-cygwin的flag,來使用Mingw編譯。  而與Cygwin更有可比性的MSys上的工具也是通過Cygwin這種模擬的方式來提供的。 

總之這兩個項目有千絲萬縷的關系,一個不恰當的比方,如果Mingw是MFC,Cygwin就是.NET了。

簡單的說來:

1.修改編譯器,讓window下的編譯器把諸如fork的調用翻譯成等價的形式--這就是mingw的做法.

2.修改庫,讓window提供一個類似unix提供的庫,他們對程序的接口如同unix一樣,而這些庫,當然是由win32的API實現的--這就是cygwin的做法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM