Cygwin是許多軟件的集合,最初由Cygnus Solutions開發,用於各類版本的Microsoft Windows上,運行UNIX類系統。Cygwin的主要目的是經過從新編譯,將POSIX系統(例如Linux、BSD,以及其餘Unix系統)上的 軟件移植到Windows上(注:我能夠在windows上開發,而後移植到Linux)。Cygwin移植工做在Windows NT、Windows 2000、Windows XP以及Windows Server 2003上比較好,在Windows 95和Windows 98上,相對差勁一些。Cygwin由Red Hat等負責維護。
[1]
cygwin是一個在windows平臺上運行的unix模擬環境,是cygnus solutions公司開發的自由軟件(該公司開發了不少好東西,著名的還有eCos,不過現已被
Redhat收購)。它對於學習unix/linux操做環境,或者從linux到windows的
應用程序移植,或者進行某些特殊的開發工做,尤爲是使用gnu工具集在windows上進行
嵌入式系統開發,很是有用。隨着
嵌入式系統開發在國內日漸流行,愈來愈多的開發者對cygwin產生了興趣。
2發展歷史
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包做爲產品來提供。
3組成
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(例如,一個俄語用戶,他的codepages是CP1251和CP866,而不能是KOI8-R、ISO/IEC 8859-五、UTF-8等),Cygwin對其餘字符集都不支持。
Red Hat 規定,Cygwin 庫遵照 GNU General Public License,但也能夠跟符合開源定義的自由軟件連接。Red Hat 另有價格不菲的許可協議,這樣使用 Cygwin 庫的專屬軟件,就能夠進行再發布。
4工做機制
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上工做。
5安裝
安裝
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上裝,適用於
網速較快的狀況。在選擇鏡像頁面,可使用一些中國的鏡像源以便提升網速。
[2]
鏡像源地址 |
描述 | 網絡協議 |
---|---|---|
mirrors.ustc.edu.cn | 中國科學技術大學開源軟件鏡像 | HTTP/FTP |
mirrors.neusoft.edu.cn | 大連東軟信息學院網絡中心開源鏡像站 | HTTP/FTP |
mirrors.163.com | 網易開源鏡像站 | HTTP |
mirrors.sohu.com | 搜狐開源鏡像站 | HTTP |
若是你和
網速不是很快,或者說裝過以後想把下載的安裝文件保存起來,下次再也不下載了直接安裝,就應該選擇"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上點,會有不一樣的響應)
好了,下面就開始個人linux旅程了。雙擊cygwin的
快捷方式進入系統。
首先介紹幾個簡單的
linux命令。
pwd 顯示當前的路徑
cd 改變當前路徑,無參數時進入對應用戶的home目錄
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
6使用指南
引言
cygwin同時支持win32和posix風格的
路徑,路徑
分隔符能夠是正
斜槓也能夠是反斜槓。還支持UNC路徑名。(在網絡中,UNC是一種肯定文件位置的方法,使用這種方法用戶能夠不關心存儲設備的物理位置,方便了用戶使用。在Windows
操做系統,Novell Netware和其它操做系統中,都已經使用了這種規範以取代本地命名系統。在UNC中,咱們不用關心文件在什麼盤(或卷)上,不用關心這個盤(或卷)所在服務器在什麼地方。咱們只要如下面格式就能夠訪問文件:
\\服務器名\共享名\
路徑\文件名
共享名有時也被稱爲文件所在卷或存儲設備的邏輯標識,但使用它的目的是讓用戶沒必要關心這些卷或存儲設備所在的物理位置。)
符合posix標準的
操做系統(如linux)沒有盤符的概念。全部的
絕對路徑都以一個
斜槓開始,而不是盤符(如c:)。全部的文件系統都是其中的子目錄。例如,兩個硬盤,其中之一爲根,另外一個多是在/disk2路徑下。
由於許多unix系統上的程序假定存在單一的posix文件系統結構,因此cygwin專門維護了一個針對win32文件系統的內部posix視圖,使這些程序能夠在Windows下正確運行。在某些必要的狀況下,cygwin會使用這種映射來進行win32和posix
路徑之間的轉換。
cygwin mount表
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的問題
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就能夠正常的發現頭文件了。
7版本發佈
在官方網站cygwin.com上能夠看到最新版本。