windows下的linux開發環境Mingw與Cygwin

minGW給那些習慣於在Linux上開發的人員,在windows上提供了一套類似的工具集。
cygwin主要是對於再Linux的程序,無需改動代碼即可移植到windows上。
gnuwin32主要是對習慣linux工具的人員,在windows上提供一套類似的命令。
Unix下編譯通過的C代碼,在win32下編譯是不能通過的 ,當然Unix 和win32的API都是符合標準C,也就是說,大多數函數調用在unix和win32下是相同的.但是,unix有自己一些獨特的API(如fork,spawn,signals,select,sockets等),如果代碼中使用了這些API,在win32下當然找不到對應的庫。
但是,這些API的功能在win32中也能實現,也許你已經發現了一個能讓window編譯Unix風格代碼的方法:
1.修改編譯器,讓window下的編譯器把諸如fork的調用翻譯成等價的形式--這就是mingw的做法.
2.修改庫,讓window提供一個類似unix提供的庫,他們對程序的接口如同unix一樣,而這些庫,當然是由win32的API實現的--這就是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了。
用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對應的實現,來把結果返回給程序。  
可以用查看他們編譯好的程序的導入表來驗證這點。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章