Cygwin

Cygwin

Cygwin是一個在windows平台上運行的類UNIX模擬環境,是cygnus solutions公司開發的自由軟體(該公司開發的著名工具還有eCos,不過現已被Redhat收購)。它對於學習UNIX/Linux操作環境,或者從UNIX到Windows的應用程式移植,或者進行某些特殊的開發工作,尤其是使用GNU工具集在Windows上進行嵌入式系統開發,非常有用。隨著嵌入式系統開發在國內日漸流行,越來越多的開發者對Cygwin產生了興趣。 Cygwin 提供一個UNIX 模擬 DLL 以及在其上層構建的多種可以在 Linux 系統中找到的軟體包,在 Windows XP SP3 以上的版本提供良好的支持。Cygwin主要由Red Hat及其下屬社區負責維護。

基本簡介

Cygwin是許多軟體的集合,最初由Cygnus Solutions開發,用於各種版本的Microsoft Windows上,運行UNIX類系統。Cygwin的主要目的是通過重新編譯,將POSIX系統(例如Linux、BSD,以及其他Unix系統)上的軟體移植到Windows上。Cygwin移植工作在Windows NT、Windows 2000、Windows XP以及Windows Server 2003上比較好,在Windows 95和Windows 98上,相對差勁一些。Cygwin由Red Hat等負責維護。

cygwin是一個在windows平台上運行的unix模擬環境,是cygnus solutions公司開發的自由軟體(該公司開發了很多好東西,著名的還有eCos,不過現已被Redhat收購)。

它對於學習unix/linux操作環境,或者從linux到windows的應用程式移植,或者進行某些特殊的開發工作,尤其是使用gnu工具集在windows上進行嵌入式系統開發,非常有用。隨著嵌入式系統開發在國內日漸流行,越來越多的開發者對cygwin產生了興趣。

發展歷史

CygwinCygwin

Cygwin始於1995年,最初作為Cygnus工程師Steve Chamberlain的一個項目。當時Windows NT和Windows 95將COFF作為目標代碼,而GNU已經支持x86和COFF,以及C語言庫newlib。這樣至少在理論上,可以將GCC重定向,作為cross compiler,從而產生能在Windows上運行的可執行程式。在後來的實踐中,這很快實現了。

接下來的問題是如何在Windows系統中引導編譯器,這需要對Unix的足夠模擬,以使GNU configure的shell script可以運行,這樣就用到像bash這樣的shell,進而需要Fork和standard I/O。Windows含有類似的功能,所以Cygwin庫只需要進行翻譯調用、管理私有數據,比如檔案描述符。

1996年後,由於看到cygwin可以提供Windows系統上的Cygnus嵌入式工具(以往的方案是使用DJGPP),其他工程師也加入了進來。特別吸引人的是,Cygwin可以實現three-way cross-compile,例如可以在Sun工作站上build,如此就形成Windows-x-MIPS cross-compiler,這樣比單純在PC上編譯要快不少。1998年起,Cygnus開始將Cygwin包作為產品來提供。

組成模組

Cygwin包括了一套庫,該庫在Win32系統下實現了POSIX系統調用的API;還有一套GNU開發工具集(比如GCC、GDB),這樣可以進行簡單的軟體開發;還有一些UNIX系統下的常見程式。2001年,新增了X Window System。

另外還有一個名為MinGW的庫,可以跟Windows本地的MSVCRT庫(Windows API)一起工作。MinGW占用記憶體、硬碟空間都比較少,能夠連結到任意軟體,但它對POSIX規範的實現沒有Cygwin庫完備。

但糟糕的是,Cygwin不支持Unicode。實際上,除了當前Windows系統以及OEM codepages(例如,一個俄語用戶,他的代碼頁是CP1251和CP866,而不能是KOI8-R、ISO/IEC 8859-5、UTF-8等),Cygwin對其他字元集都不支持。Cygwin 的較新版本可以通過自帶終端模擬器的設定來滿足顯示 UTF-8 和更多代碼頁的功能。

Red Hat 規定,Cygwin 庫遵守 GNU General Public License,但也可以跟符合開源定義的自由軟體連結。Red Hat 另有價格不菲的許可協定,這樣使用 Cygwin 庫的專屬軟體,就可以進行再發布。

工作機制

cygnus當初首先把gcc,gdb,gas等開發工具進行了改進,使他們能夠生成並解釋win32的目標檔案。然後,他們要把這些工具移植到windows平台上去。一種方案是基於win32 api對這些工具的原始碼進行大幅修改,這樣做顯然需要大量工作。因此,他們採取了一種不同的方法——他們寫了一個共享庫(就是cygwin dll),把win32 api中沒有的unix風格的調用(如fork,spawn,signals,select,sockets等)封裝在裡面,也就是說,他們基於 win32 api寫了一個unix系統庫的模擬層。這樣,只要把這些工具的原始碼和這個共享庫連線到一起,就可以使用unix主機上的交叉編譯器來生成可以在 windows平台上運行的工具集。以這些移植到windows平台上的開發工具為基礎,cygnus又逐步把其他的工具(幾乎不需要對原始碼進行修改,只需要修改他們的配置腳本)軟體移植到windows上來。這樣,在windows平台上運行bash和開發工具、用戶工具,感覺好像在unix上工作。

安裝說明

安裝

cygwin的安裝檔案很容易通過google找到。目前國內的網站上有"網路安裝版"和"本地安裝版"兩種。標準的發行版應該是 網路安裝版。兩者並無大不同,下面介紹一下安裝的過程。

step1. 下載後,點擊安裝檔案(setup.exe)進行安裝,第一個畫面是GNU著作權說明,點"下一步(N)—>",

環境變數

開始運行bash之前,應該設定一些環境變數。cygwin提供了一個.bat檔案,裡面已經設定好了最重要的環境變數。通過它來啟動bash是最安全的辦法。這個.bat檔案安裝在cygwin所在的根目錄下。 可以隨意編輯該檔案。

CYGWIN變數用來針對cygwin運行時系統進行多種全局設定。開始時,可以不設定CYGWIN或者在執行bash前用類似下面的格式在dos框下把它設為tty

C:\> set CYGWIN=tty notitle glob

PATH變數被cygwin應用程式作為搜尋可知性檔案的路徑列表。當一個cygwin進程啟動時,該變數被從windows格式(e.g. C:\WinNT\system32;C:\WinNT)轉換成unix格式(e.g., /WinNT/system32:/WinNT)。如果想在不運行bash的時候也能夠使用cygwin工具集,PATH起碼應該包含x:\cygwin\bin,其中x:\cygwin 是你的系統中的cygwin目錄。

HOME變數用來指定主目錄,推薦在執行bash前定義該變數。當cygwin進程啟動時,該變數也被從windows格式轉換成unix格式,例如,作者的機器上HOME的值為C:\(dos命令set HOME就可以看到他的值,set HOME=XXX可以進行設定),在bash中用echo $HOME看,其值為/cygdrive/c.

TERM變數指定終端型態。如果沒對它進行設定,它將自動設為cygwin。

LD_LIBRARY_PATH被cygwin函式dlopen()作為搜尋.dll檔案的路徑列表,該變數也被從windows格式轉換成unix格式。多數Cygwin應用程式不使用dlopen,因而不需要該變數。

進入安裝模式選擇畫面。

step2. 安裝模式有"Install from Internet"、"Download form Internet"、

"Install from Local Directory" 三種。"Install form Internet"就是直接從internet上裝,適用於網速較快的情況。如果你和我一樣網速不是很快,或者說裝過之後想把下載的安裝檔案保存起來,下次不再下載了直接安裝,就應該選擇"Download form Internet",下載安裝的檔案(大約40M左右)。

事實上,所謂的"本地安裝版",也是別人從網上下載全部檔案後打的包(適用於中國國情嘛^_^)

step3. 接下來是選擇安裝目的路徑和安裝源檔案所在的路徑,之後就進入了選擇安裝包所在的路徑。

注意了阿,這裡可是重頭戲。我第一安裝的時候就是沒有看清這一步,結果沒有把gcc裝進去,導致沒法編譯檔案。

+ All Default

+ Admin Default

....

+ Devel Default

+ Editors Default

....

如上圖所示,你在這個TreeView的某個節點上雙擊,就可以改變它的狀態,如Default、Install、Uninstall、Reinstall四種狀態。默認的都是Default狀態,很多工具的默認狀態都是不安裝。

在這裡我選擇了在All這一行上後面的Default上點Install,全部安裝,以免後患。(注意:這裡的樹形控制項和win下面的不同,你試試點在All上點 和 在All這一行後面的Default上點,會有不同的回響)

step4. 點下一步,安裝成功。它會自動在你的桌面上建立一個捷徑。

好了,下面就開始我的linux旅程了。雙擊cygwin的捷徑進入系統。

首先介紹幾個簡單的linux命令。

pwd 顯示當前的路徑

cd 改變當前路徑,無參數時進入對套用戶的home目錄

CygwinCygwin

ls 列出當前目錄下的檔案。此命令有N多參數,比如ls -al

ps 列出當前系統進程

kill 殺死某個進程

mkdir 建立目錄

rmdir 刪除目錄

rm 刪除檔案

mv 檔案改名或目錄改名

man 在線上幫助

less 顯示檔案的最末幾行

由於linux下面的命令大多都有很多參數,可以組合使用。所以,每當你不會或者記不清楚改用那個參數,那個開關的時候,可以用man來查找,比如,我想查找ls怎么使用,可以鍵入

$ man ls

系統回顯信息如下:

LS(1) FSF LS(1)

NAME

ls - list directory contents

SYNOPSIS

ls [OPTION]... [FILE]...

DESCRIPTION

List information about the FILEs (the current directory by

default). Sort entries alphabetically if none of -cftuSUX

nor --sort.

-a, --all

do not hide entries starting with .

-A, --almost-all

do not list implied . and ..

-b, --escape

print octal escapes for nongraphic characters

--block-size=SIZE

use SIZE-byte blocks

使用指南

cygwin同時支持win32和posix風格的路徑,路徑分隔設定可以是正斜槓也可以是反斜槓。還支持UNC路徑名。(在網路中,UNC是一種確定檔案位置的方法,使用這種方法用戶可以不關心存儲設備的物理位置,方便了用戶使用。在Windows作業系統,Novell Netware和其它作業系統中,都已經使用了這種規範以取代本地命名系統。在UNC中,我們不用關心檔案在什麼盤(或卷)上,不用關心這個盤(或卷)所在伺服器在什麼地方。我們只要以下面格式就可以訪問檔案:

\\伺服器名\共享名\路徑\檔案名稱

共享名有時也被稱為檔案所在卷或存儲設備的邏輯標識,但使用它的目的是讓用戶不必關心這些卷或存儲設備所在的物理位置。)

符合posix標準的作業系統(如linux)沒有盤符的概念。所有的絕對路徑都以一個斜槓開始,而不是盤符(如c:)。所有的檔案系統都是其中的子目錄。例如,兩個硬碟,其中之一為根,另一個可能是在/disk2路徑下。

因為許多unix系統上的程式假定存在單一的posix檔案系統結構,所以cygwin專門維護了一個針對win32檔案系統的內部posix視圖,使這些程式可以在Windows下正確運行。在某些必要的情況下,cygwin會使用這種映射來進行win32和posix路徑之間的轉換。

cygwin中的mount程式用來把win32盤符和網路共享路徑映射到cygwin的內部posix目錄樹。這是與典型unix mount程式相似的概念。對於那些對unix不熟悉而具有Windows背景的的人來說,mount程式和早期的dos命令join非常相似,就是把一個盤符作為其他路徑的子目錄。

路徑映射信息存放在當前用戶的cygwin mount表中,這個mount table 又在windows的註冊表中。這樣,當該用戶下一次登錄進來時,這些信息又從註冊表中取出。mount 表分為兩種,除了每個用戶特定的表,還有系統範圍的mount表,每個cygwin用戶的安裝表都繼承自系統表。系統表只能由擁有合適許可權的用戶(Windows nt的管理員)修改。

當前用戶的mount表可以在註冊表"HKEY_CURRENT_USER/Software/Red Hat, Inc./Cygwin/mounts v" 下看到。

系統表

存在HKEY_LOCAL_MACHINE下。

posix根路徑/預設指向系統分區,但是可以使用mount命令重新指向到Windows檔案系統中的任何路徑。cygwin從win32路徑生成posix路徑時,總是使用mount表中最長的前綴。例如如果c:被同時安裝在/c和/,cygwin將把C:/foo/bar轉換成/c/foo/bar.

如果不加任何參數地調用mount命令,會把Cygwin當前安裝點集合全部列出。在下面的例子中,c盤是POSIX根,而d盤被映射到/d。本例中,根是一個系統範圍的安裝點,它對所有用戶都是可見的,而/d僅對當前用戶可見。

c:\> mount

f:\cygwin\bin on /usr/bin type system (binmode)

f:\cygwin\lib on /usr/lib type system (binmode)

f:\cygwin on / type system (binmode)

e:\src on /usr/src type system (binmode)

c: on /cygdrive/c type user (binmode,noumount)

e: on /cygdrive/e type user (binmode,noumount)

還可以使用mount命令增加新的安裝點,用umount刪除安裝點。

當Cygwin不能根據已有的安裝點把某個win32路徑轉化為posix路徑時,cygwin會自動把它轉化到一個處於預設posix路徑/cygdrive下的的一個安裝點. 例如,如果Cygwin 訪問Z:\foo,而Z盤當前不在安裝表內,那么Z:\將被自動轉化成/cygdrive/Z.

可以給每個安裝點賦予特殊的屬性。自動安裝的分區顯示為“auto”安裝。安裝點還可以選擇是"textmode"還是 "binmode",這個屬性決定了文本檔案和二進制檔案是否按同樣的方式處理。

路徑信息

cygpath工具提供了在shell腳本中進行win32-posix路徑格式轉換的能力。

HOME, PATH,和LD_LIBRARY_PATH環境變數會在cygwin進程啟動時自動被從Win32格式轉換成了POSIX格式(例如,如果存在從該win32路逕到posix路徑的安裝,會把c:\cygwin\bin轉為/bin)。

存儲容量

Cygwin程式預設可以分配的記憶體不超過384 MB(program+data)。多數情況下不需要修改這個限制。然而,如果需要更多實際或虛擬記憶體,應該修改註冊表的HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER區段。添加一個DWORD鍵heap_chunk_in_mb並把它的值設為需要的記憶體限制,單位是十進制MB。也可以用cygwin中的regtool完成該設定。例子如下:

regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024

regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin

1.7版本和Eclipse的問題

cygwincygwin

Eclipse是一款比較出名的IDE,功能強大,可以用來做C\C++開發。Eclipse開發C\C++,需要用到CDT外掛程式,就可以利用Cygwin開發一些linux移植windows的開發,或者交叉編譯(微軟的VC編譯器不提供此功能)。如今比較火爆的Android NDK開發,如果在windows平台下就必須使用Cygwin。而且CDT外掛程式使用註冊表發現Cygwin軟體的安裝位置,如果使用Eclipse軟體開發的話,Cygwin在安裝的時候就不用配

置任何的環境變數,非常方便。

但是隨著Cygwin更新到1.7,CDT外掛程式工作開始不正常,最明顯的兩個症狀是:1.console無輸出,2.按住ctrl點擊,很多標準對象找不到對應的頭檔案。

解決方法:打開eclipse,windows->preferences->C\C++->Debug->Source Lookup Path,點擊Add,添加一個Path Mapping,名字可以隨意取,比如Cygwin Path Mapping;假設Cygwin安裝在C糟,將/cygdriver/c映射到C:\,確定保存以後,重啟Eclipse,以前的ctrl點擊,控制台輸出就正常了。

此方法出處來自於CDT外掛程式的FAQ,具體網址是參見擴展閱讀。原理非常簡單,因為Eclipse是一個跨平台的編譯器,所以CDT外掛程式在磁碟上找檔案的時候也是採用的unix風格的路徑,所以在windows上無法正常工作,做一個路徑映射,將Cygwin所在磁碟的路徑映射為windows風格的路徑,CDT就可以正常的發現頭檔案了。

版本發布

2012年10月21日,Cygwin 1.7.17 發布 - Windows下的Linux開發工具。

在官方網站上可以看到最新版本。

相關詞條

相關搜尋

熱門詞條

聯絡我們