mingW与cygwin
首先MingW和cygwin都可以用來(lái)跨平臺(tái)開發(fā)。??
MinGW是Minimalistic?GNU?for?Windows的縮寫,也就是Win版的GCC。??
Cygwin則是全面模擬了Linux的接口,提供給運(yùn)行在它上面的的程序使用,并提供了大量現(xiàn)成的軟件,更像是一個(gè)平臺(tái)。??
相對(duì)的MingW也有一個(gè)叫MSys(Minimal?SYStem)的子項(xiàng)目,主要是提供了一個(gè)模擬Linux的Shell和一些基本的Linux工具。因?yàn)榫幾g一個(gè)大型程序,光靠一個(gè)GCC是不夠的,還需要有Autoconf等工具來(lái)配置項(xiàng)目,所以一般在Windows下編譯ffmpeg等Linux下的大型項(xiàng)目都是通過Msys來(lái)完成的,當(dāng)然Msys只是一個(gè)輔助環(huán)境,根本的工作還是MingW來(lái)做的。?
用MingW和cygwin編譯出來(lái)的程序的區(qū)別。??
首先MingW和cygwin都不能讓Linux下的程序直接運(yùn)行在Windows上,必需通過源代碼重新編譯。??
現(xiàn)代操作系統(tǒng)包括Windows和Linux的基本設(shè)計(jì)概念像進(jìn)程線程地址空間虛擬內(nèi)存這些都是大同小異的,之所以二者上的程序不能兼容,主要是它們對(duì)這些功能具體實(shí)現(xiàn)上的差異,首先是可執(zhí)行文件的格式,Window使用PE的格式,并且要求以.EXE為后綴名。Linux則使用Elf。其次操作系統(tǒng)的API也不一樣,如Windows用CreateProcess()創(chuàng)建進(jìn)程,而Linux使用fork()。??
所以要移植程序必然要在這些地方進(jìn)行改變,MingW有專門的W32api頭文件,來(lái)把代碼中Linux方式的系統(tǒng)調(diào)用替換為對(duì)應(yīng)的Windows方式。而Cygwin則通過cygwin1.dll這個(gè)文件來(lái)實(shí)現(xiàn)這種API的轉(zhuǎn)換,并模擬一個(gè)Linux系統(tǒng)調(diào)用接口給程序,程序依然以Linux的方式調(diào)用系統(tǒng)API,只不過這個(gè)API在cygwin1.dll上,cygwin1.dll再調(diào)用Windows對(duì)應(yīng)的實(shí)現(xiàn),來(lái)把結(jié)果返回給程序。??
可以用查看他們編譯好的程序的導(dǎo)入表來(lái)驗(yàn)證這點(diǎn)。??
二者生成的程序都是能在Windows上運(yùn)行的EXE文件,顯然都是PE格式,用一個(gè)PE格式查看工具檢查一下就能發(fā)現(xiàn),Cygwin生成的程序依然有fork()這樣的Linux系統(tǒng)調(diào)用,但目標(biāo)庫(kù)是cygwin1。而MingW生成的程序,則全部使用從KERNEL32導(dǎo)出的標(biāo)準(zhǔn)Windows系統(tǒng)API。??
這樣看來(lái)用Mingw編譯的程序性能會(huì)高一點(diǎn),而且也不用帶著那個(gè)接近兩兆的cygwin1.dll文件。??
但Cygwin對(duì)Linux的模擬比較完整,甚至有一個(gè)Cygwin?X的項(xiàng)目,可以直接用Cygwin跑X。??
另外Cygwin可以設(shè)置-mno-cygwin的flag,來(lái)使用Mingw編譯。??
而與Cygwin更有可比性的MSys上的工具也是通過Cygwin這種模擬的方式來(lái)提供的。??
總之這兩個(gè)項(xiàng)目有千絲萬(wàn)縷的關(guān)系,一個(gè)不恰當(dāng)?shù)谋确?#xff0c;如果Mingw是MFC,Cygwin就是.NET了。
?
=====================
1.修改編譯器,讓window下的編譯器把諸如fork的調(diào)用翻譯成等價(jià)的形式--這就是mingw的做法.?
2.修改庫(kù),讓window提供一個(gè)類似unix提供的庫(kù),他們對(duì)程序的接口如同unix一樣,而這些庫(kù),當(dāng)然是由win32的API實(shí)現(xiàn)的--這就是cygwin的做法.?
總結(jié)
以上是生活随笔為你收集整理的mingW与cygwin的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CriminalIntent项目的强大完
- 下一篇: 栈的应用--进制转换