版本:v1.0
摘要
本文主要介绍了什么是Cygwin,如何安装Cygwin,使用Cygwin时的一些常见问题总结,总结Cygwin的使用技巧和心得,其他和Cygwin相关的东西
2013-09-04
修订历史 | ||
---|---|---|
修订 1.0 | 2013-09-04 | crl |
|
版权 © 2013 Crifan, http://crifan.com
目录
插图清单
本文目的在于,详细解释什么是Cygwin,如何使用Cygwin
以实现,对于Cygwin不了解的人,看了后,可以达到:
知道什么是Cygwin
在具体如何安装和使用时,都有合适的参考资料
对于Cygwin的新划分除了的x86和x64,抽空去研究搞懂,除了本身x86和x64的区别之外,细节上有何其他区别。
所以之前介绍的,添加:http://mirrors.163.com/cygwin/的方法,也是错的了
需要同步去更新。
对应章节:为何手动添加URL时,输入的是而不是
之前折腾cygwin中把make从3.82换成3.81的过程,整理过来
目录
相关旧帖:
Cygwin是一个集合,这个集合包含了一堆的工具,目的在于,在windows平台上,提供一个Linux的环境。
作为在Windows下面的软件,Cygwin中最核心的,是个dll库,叫做cygwin1.dll,
其提供了底层的Linux API的所有功能,供Cygwin下面的各种工具,模块等调用,以此来实现在Windows下模拟Linux环境。
从cygwin的具体表现和文件组成上来说,就是:核心的Cygwin DLL文件 + 各种Linux下面的模块(工具/软件/库)
计算机的世界,在操作系统方面,目前用的最广泛的,有三类:开源免费的Linux,微软的Windows,苹果的Mac。
随着计算机的发展,很多时候,尤其是做软件开发方面,常常会遇到在某种平台上,希望利用到另外一种平台上的工具,或环境,其中就包括在Windows下面,利用Linux中的环境和工具。
对于此种需求,最终才出现了各种方案,Cygwin就是其中的一种,提供了一个Windows下面使用Linux环境的平台。
有人会问了,不是很多功能,windows下面也有类似的软件可以实现吗?为何非要(在Windows环境下)去用Linux的环境(中的软件)呢?
那是因为,等你对Linux有更多了解的时候,就会发现,Linux下面的很多很多的更强大的功能,是windows下面没有对应的功能,或者即使有,也不好用。
比如Linux世界中,最常用的项目编译过程管理的工具makefile,Windows下面的就没有足够好用的类似的工具
而且一般与Makefile搭配使用的其他很多别的工具,使得组合起来使用,可以实现非常强大且复杂的一些功能。
随着软件开发的深入,至少我个人感觉,才能越加发现Linux的各种强大和好处。
所以才会遇到,不少时候,需要在Windows下去模拟Linux环境,以便去使用Linux中的各种强大功能的软件,工具的
不论是做偏底层的嵌入式开发,还是做上层软件的开发,都可能会用到Cygwin。
简单说就是:
想要在Windows平台上,折腾Linux系统中的东西
然后才用到Cygwin去模拟Linux环境,去在Linux环境下实现各种复杂的功能和目标
此处,随便举一些例子:
就像我之前写的教程中:
详细介绍的一样,对于Docbook环境的搭建,其实是可以使用Windows下的二进制的xsltproc+fop来实现的
但是,其总体上能够实现的功能相对较弱。
而我此处,有个相对比较复杂的需求:
需要管理20多个Docbook的book
如果编译每一个book,都需要手动去输入对应的编译命令的话,相关的工作量极大且极其繁琐,且容易出错,直接就把人累死了
而通过Cygwin中的makefile来实现,就相对轻松多了。
所以后来就去花点时间,去写了对应的makefile
以实现,对于每个book下的src文件夹下,去:
make html make pdf make htmls make rtf make chm make txt
就可以对于每个book,生成其对应的不同格式的输出文件。
而在windows下面,类似的功能,我最多只能用batch批处理文件去实现,
但是却缺少了Makefile中的依赖特性,其可以自动检测所依赖的文件是否已更新,决定是否重新编译。
即,对于多个文件,尤其是中型大型等项目的管理方面,windows的batch,比linux中的makefile差的太远了。
另外,由于要生成chm等格式的文件,我此处还需要一些其他的辅助工具
比如用于转换编码的iconv,而这类好用易用的各种工具,在Linux下面,都是必备的,无需额外安装和太操心
但是如果想要在windows下使用,还要去一个个找到对应的windows下面的版本,或者找到相应的源码,自己去编译一个版本。
如此,经常需要利用到Linux下面的各种强大好用的工具,但是windows下面常常没有或者有类似的但不好用或功能很弱,
因此,才需要用到Cygwin去模拟Linux,
然后在Linux下面,利用已有的各种工具,实现各种复杂的需求的。
关于实现细节,可参考:
cygwin的版本,涉及到两个东西。
一个是cygwin的核心==Cygwin DLL文件==cygwin1.dll,其最新版本,可以从cygwin主页上看到,此刻,2012-06-20,是1.7.15-1。
另外一个就是在线安装文件setup.exe的版本,其在安装过程中可以看到,比如图 2.1 “Cygwin Net Release Setup Program”中的是2.774。
所以,如果你看到有人写的cygwin的版本是2.x的,那都是指的是setup.exe安装包的版本。如果写的是1.x.x的,那都是指的是核心的dll文件的版本。
目录
Cygwin的安装方式,总的来说,你一般所能见到的,有两种:
Cygwin的官网中,有个安装文件setup.exe,其固定的不变的下载的地址是Cygwin的setup.exe。
此setup.exe本身很小,比如此刻,2012-06-20,下载下来的setup.exe,就只有689KB:
而这些在线下载或本地已有的文件,则是非常大,一般来说,都是多达1,2G,甚至3,4G,而安装完毕之后的cygwin则往往要占用5,6G甚至更多的硬盘空间。
当然,如果你安装时候所选择要安装的模块很少的话,占用硬盘空间则会相应变小一些,但估计也还是以GB为单位。
关于具体的安装过程,请参考第 2.2 节 “Cygwin在线安装指南”
你可能也许听说,有个Cygwin的ISO,也是用于安装Cygwin的。
而ISO中所包含的文件,就是一个setup.exe和下载下来的各个模块的安装包。
这些文件,其实就是上述通过setup.exe(在安装过程中)下载下来(并安装)的而已。
所以,并没有比setup.exe有啥特殊的地方。
不过,很明显,其有个最大的好处,那就是不用非要去通过setup.exe去在线下载和安装了。
因为,通过setup.exe去链接某个服务器,其速度往往不是那么快。
即便是目前对国内来说最快的163的服务器,速度已经很快了,但是还是没有(比如用迅雷)单独去下载ISO速度来得快。
所以,如果可以的话,还是ISO下载,来得快,然后本地安装,就避免了在线连接服务器去下载太慢的问题。
关于目前可用的ISO镜像的下载地址,请参考目前已知的可用的Cygwin的ISO下载地址
目前已知的可用的Cygwin的ISO下载地址 | |
---|---|
关于可用的Cygwin的ISO,之前就整理过一些帖子: 此处简要整理如下:
|
下面详细解释Cygwin的setup.exe的安装过程:
双击setup.exe,则会出现安装界面:
可以看到,其中对于setup.exe,即此安装包,也是有对应的版本的,此处的是2.774。
点击“下一步”,出现“Choose installation type”界面:
其中有三个选项:
从网上下载(下载下来的文件,也可以将来再用)
其意思是,从网上下载的文件,存在本地硬盘后,以后万一遇到诸如某个模块被破坏了,不能用了,则可以再通过此setup.exe去重新安装一下,但是选择的是下面要说的第三项,即选择从本地某个文件夹安装,即此处之前下载好了的,效果相当于,windows中安装程序的修复功能。
关于如何从网上下载安装,接下来会详细解释。
只下载不安装
其用意,暂时没有完全搞懂。大概是为了先完全下载下来,然后方便选择性的安装自己需要的模块吧。
为选择从本地安装
上面已经提到了,其前提是,之前已经下载过了对应的所需的各个安装模块了,此时可以选择此项,去全新安装或者修复式安装某个模块。
点击“下一步”后,出现“Select Root Install Directory”的界面:
其中Root Directory,指的是你所要将Cygwin安装到哪个目录。
默认为C:\cygwin,此处可以改为自己所要的路径,也可以用默认值,都可以。
我此处改为我所要的路径:E:\DevTools\Cygwin\cygwin_install
然后对于Install for,有两种选择:
为windows当前所有用户都有效。
只对当前的windows用户有效。
此处选择默认的,对所有用户都有效,即可。
点击“下一步”后,进入“Select Local Package Directory”的界面:
其中Local Package Directory部分,是由于前面选择的是从网上下载并安装,所以此处让你选择对于下载下来的各个模块的安装文件,都放在哪里,此处,根据自己需要,设置一个路径即可。
我此处设置为E:\download\cygwin\cygwin_down
设置的路径(文件夹)最好是已经创建好的 | |
---|---|
不过要注意一点的是,确保你的设置的路径,是真实存在的,否则就会出现这样的错误提示了: 当然,此时也是可以点击”是(Y)“去让其帮你创建对应的路径的。 |
然后就进入”Select Your Internet Connection“的界面了:
此时对于网络连接方式,有几种选择:
一般多数用户都是这种直接连接的网络,所以都是直接使用默认设置即可。
使用IE代理设置,如果你本身上网是通过代理上的,且IE中已经设置好了代理,那么就可以用此种设置了。
使用HTTP或FTP类型的代理。同理,如果有需要,自己选择此项后,设置对应的代理地址和端口,即可。
点击”下一步“后,其会自动去下载一个服务器的列表,然后跳转到”Choose A Download Site“的界面:
此处需要选择一个服务器,之后就是从该服务器下载对应的安装所需的模块文件了。
因此,此处如果选择的服务器不合适的话,尽管你的网络本身速度很快,但是此处下载速度很慢。
所以,此处需要选择一个速度比较快的服务器。
对于国内来说,连接很多国外的服务器,速度一般都很慢。
不过,目前已经的,口碑较好的,速度较快的服务器,是近几年刚出现的163的服务器。
所以,此处对于多数人,最好的选择就是选择163的服务器。
此处,我这里,由图可见,已经默认选择好了163的服务器,所以不需要额外设置了。
如果你的选择其他的服务器,而且服务器列表中也找不到163的话,那么可以自己手动添加:
在Use URL处,输入:
http://mirrors.163.com/cygwin/
关于163镜像服务器 | |
---|---|
163是个好公司,因为刚看到http://mirrors.163.com/.help/中的介绍,得知其前身就是cn99镜像。 之前玩过Ubuntu的人,估计多数都知道cn99这个镜像,因为对于国内来说,apt的源的地址中,属其速度最快。 而且,现又发现,163的镜像,除了提供cygwin,其还提供了其他很多资源的镜像,都可以在http://mirrors.163.com/中找到。 包括很多常见的,比如mandriva,openSUSE,ubuntu等等。 |
为何手动添加URL时,输入的是而不是 | |
---|---|
首先要说的是,直接输入在图 2.2 “Choose A Download Site”中所看的的地址http://mirrors.163.com/,是无法正常连接163服务器去下载cygwin的。 这也是我之前在【记录】Cygwin下载过程记录中所遇到并解决了的问题。 而具体的原因是为何,我也是刚刚才注意到的: 因为cygwin去安装的话,不论是在线安装还是本地安装,都会需要一个对应的配置文件: 因此,你给cygwin的setup.exe指定了http://mirrors.163.com/后,其从此URL中,找不到对应的setup.ini,所以无法继续安装cygwin。 所以URL中需要输入http://mirrors.163.com/cygwin/。 |
点击“下一步”后,其会解析一下,然后进入”Select Package“的界面:
此界面,才是整个Cygwin安装过程中的最重要,最需要详细讲解的部分。
先来说说,那一堆的列表。
可以看到,其有Accesibility,Base,Devel,Editors,Math等很多的部分。
这些,是总体的分类,对于Cygwin中所包含的N个模块的分门别类。
此处,对于安装Cygwin来说,就是安装各种各样的模块而已。
具体安装什么模块,则是根据你自己的需要,去选择不同的模块。
而对于大多数人,尤其是不熟悉的人,其实,最核心的,要记住的一点,那就是,记住一定要安装Devel这个部分的模块,其中包含了各种开发所用到的工具或模块。
而对于其他部分的设置,如果不熟悉,那么可以直接使用默认配置即可。
下面再来解释一下,如何选择或者取消对应的模块。
可以看到,其默认的各个分类后面的是Default字样,其意思很明显,就是cygwin帮我们设置好的,默认的选择安装了一些模块,其具体包含哪些模块,可以通过点击对应的分类前面的加号以展开。
以Devel为例:
点击加号:
然后就可以看到,cygwin已经默认帮忙选择了哪些安装哪些模块:
可以看到,有很多n/a的标示,其表示Not Avalibale不可用,此处即为不安装的意思,对应的模块的前面也写的是Skip,同样是跳过安装此模块的意思。
而对应方括号中间打叉,表示的是选择安装该模块,上图中即为选择安装gettext这个模块。
很明显,如果想要对几十个,几百个模块都想要安装的话,如果都要一个个点击,那岂不是累死了。
对此,cygwin早就想好了,给我们提供了更方便的设置,那就是,对于此Devel分类下面的所有的模块,如果你想要都安装,那么可以点击Devel后面的那个Default:
那么Default就会变成Install,同时,其下所有的模块,也都变成选择安装了:
对应的,再次点击Install,则会变成Reinstall,对应的Devel下面的各个模块,也都变成相应的skip了:
此处对于reinstall之所以变成skip,那是因为之前就没有安装过,所以此处对于之前没有安装过的模块,就是变成skip,即也不安装了。而如果你是第二次运行此cygwin安装程序,那么对于那些之前安装过的,则会变成对应的reinstall的。
同理,点击Reinstall,则又会变成Uninstall:
含义很明显,卸载对应的模块的意思。
如此,对于某个分类,点击对应的后面的安装选项的话,会在:Default,Install,Reinstall,Uninstall这几个选项之间来回切换。
而对于想要知道某个库,或者说模块,程序等,是否已经选择安装了,
多数人都会被cygwin里面太多的模块而搞晕掉,所以其提供了一个Search的功能。
比如,我想要去确定(用于搭建Docbook环境所必须的其中)一个叫做libxml2的模块,
那么就可以去search框中输入libxml2,则其会自动把与此libxml2相关的模块,都列出来:
不过由于各个子分类都是加号,没有展开的,所以点击加号,全部展开:
可以看到此处已经安装了Devel中的libxml2-devel这个模块了,其已经基本满足开发需求了。
但是很多时候,我们可能对于剩下的其他的与此libxml2相关的模块,不是很清楚其功能,不知道是否需要安装,那么此时,其实最简单省事的办法就是,把相关的模块,都点击Skip,直到都变成Install:
如此,就不怕漏装某个libxml2的库,而导致以后需要回来重新安装了。
如此,安装自己需求,一点点去选择自己需要的模块,即可。
选择好需要安装的模块后,就可以点击”下一步“去安装了。
然后后面就很简单了,基本上都是下一步,然后cygwin就会自动去下载并安装对应的模块了。
这个过程所需时间,取决于你所选模块的多少,和连接(前面所设置的163)服务器的速度快慢,决定了下载所用时间,以及最后加上安装所有模块的时间,总体上来说,应该都是以小时为单位,比如2,3个小时之类的时间。
最后安装完毕,会在桌面出现一个cygwin的图标,双击后,第一次运行,其会初始化一下,之后就是正常的使用Linux的环境了。
关于安装到最后有时候会死掉的解决办法 | |
---|---|
如果遇到了安装到最后,比如95%的时候死掉的问题,可以参考: |
此处,针对Cygwin中的一些模块,工具,库等,做个简单的介绍。
当然,实际上,这些东西,其实都是Linux中的常见工具,库等,
此处,只是针对我所了解的一些,做个解释,仅供参考:
是个针对编码转换的工具,其支持很多常见的编码,包括UTF-8,GB2312等等。
比如我在生成Docbook的chm格式文件的时候,就用到将UTF-8编码的文件,转换为本地编码(GB18030编码)的格式,就是用的iconv这个工具。
详情可参考iconv
目录
此处主要指的是和Cygwin本身有关的一些工具。
关于Cygwin的工具,其实cygwin官网中已有详细介绍了:Cygwin Utilities,此处只是简单解释一下,以及提醒一些注意事项:
作用:用于检测,校验cygwin。
如果cygwin本身的运行有问题了,比如缺少了某库,导致程序无法运行,则可以使用此工具,去检测到底问题出在哪里。
作用:实现Linux/Unix和Windows之间的路径转换。
其中,主要包含了Windows路径中反斜杠和Linux路径中的斜杠之间的转换,已经Windows下面的环境变量和Linux下面的环境变量的处理。
而环境变量中,又包含,多个值所用分隔符的不同,Windows是分号,Linux是冒号。
不过好像当Linux和Windows的环境变量混用,有时候,会出现一些bug,比如
Cygwin的使用过程中,也有很多注意事项,现总结如下;
Linux的环境中,路径中,是不允许包含空格的
Windows的环境中是运行的
所以,在使用Cygwin期间,常常会遇到:
PATH等环境变量,由于即包含了Windows中的很多路径
又包含了Cygwin(即Linux)中的很多路径
但是程序,脚本等处理这些路径时,有些没考虑到这种带路径的情况
而导致出现各种问题。
比如,我之前就遇到一个:
【已解决】Cygwin下为xscale编译Buildroot时make出错:/bin/sh: -c: line 0: syntax error near unexpected token `(‘
所以,以后使用时,在这方面,要小心。
以及出现类似问题,要想到,或许可能是Cygwin路径中包含空格,括号等特殊字符而导致的
下面介绍一些Cygwin中相关的小技巧:
打开注册表(regedit)并定位到
HKEY_CLASSES_ROOT\Directory\shell
然后右击shell->新建->项,然后名字随便起,比如RunCygwin
在其下再新建一项,叫做command,表示要执行的命令,command下会有一个图标是ab字样的键值,名称是(默认),类型是REG_SZ,
双击其会弹出一个"修改字符串"的窗口,修改数据数值为:
D:\tmp\tmp_dev_root\cgwin\bin\bash -login -c "cd '%1'; exec bash -rcfile ~/.bashrc"
其中
D:\tmp\tmp_dev_root\cgwin\
是我此处Cygwin安装路径下的bash的位置,其下会存在bash工具:bin\bash
然后就可以进入任何目录,右键点击,就会看到对应的可选项,此处是RunCygwin
:
点击即可进入cygwin了:
关于更多的相关的解释,请参考:【整理】在windows下添加右键使得可以运行cygwin且直接定位到当前文件夹 + 【整理】如何在Windows XP中,右键添加命令行cmd command,打开当前文件夹,定位到当前路径
原先启动Cygwin,其默认路径是当前用户的Home文件夹:
CLi@PC-CLI-1 ~ $ pwd /home/CLi
而Cygwin默认启动路径,就是由环境变量HOME的值决定的。
因此,此处就是要去改变对应的环境变量HOME的值。
此处,先去看看原先HOME的值是多少,有两种方法:
可以在cygwin下输入env查看当前所有的环境变量:
CLi@PC-CLI-1 ~ $ env HOMEPATH=\Users\CLi ... SHELL=/bin/bash TERM=xterm ... CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files OS=Windows_NT ... HOME=/home/CLi ...
其中就可以看到,此处的HOME值为/home/CLi
直接通过echo一个环境变量,得知该环境变量的值:
CLi@PC-CLI-1 ~ $ echo $HOME /home/CLi
而想要改变HOME的值,也有两种方法:
去windows中建立一个HOME的环境变量,将值设置为自己想要的值
而关于如何添加Windows的环境变量,不熟悉的人,请参考
通过export去修改环境变量:
CLi@PC-CLI-1 ~ $ echo $HOME /home/CLi CLi@PC-CLI-1 ~ $ export HOME=/home/CLi/develop CLi@PC-CLI-1 /home/CLi $ echo $HOME /home/CLi/develop
即可把HOME从/home/CLi改为/home/CLi/develop
注意 | |
---|---|
此处通过export的方式改变的值,只是当前(会话/窗口)有效,关闭了窗口后,就失效了,所以下次重启后,还是无法达到修改的效果 |
Cygwin下,从当前路径切换到Windows中别的磁盘,比如C盘,之前的做法,是通过cygdrive:
CLi@PC-CLI-1 /cygdrive/c $ pwd /cygdrive/c CLi@PC-CLI-1 /cygdrive/c $ cd /cygdrive/d CLi@PC-CLI-1 /cygdrive/d $ pwd /cygdrive/d
现在刚看到[1],才知道也可以直接通过C:的形式去切换到C盘了:
CLi@PC-CLI-1 /home/CLi $ pwd /home/CLi CLi@PC-CLI-1 /home/CLi $ cd C: CLi@PC-CLI-1 /cygdrive/c $ pwd /cygdrive/c
之前在折腾:
【记录】Cygwin下用crosstool-ng为arm制作交叉编译器
期间,就遇到这种问题:
【已解决】Win7中用Notepad++编辑cygwin下面的文件结果保存出错:请检查文件是否在别的程序中打开
具体现象是:
Cygwin下面的文件,是可以用其他编辑工具,比如Notepad++,Sublime等去编辑的
但是,编辑之后,去保存的时候,都会出错,都无法正常保存。
经过一番折腾,结果找到了根本原因:
Cygwin下面的有些文件,其文件的拥有者(owner),不是Win7中当前的用户
导致有些Cygwin下面的文件,在Win7下面,会没有修改删除等权限。
所以,对应的解决办法就是:
给Win7的当前用户,增加操作这些文件的权限。
其实现起来也有各种办法,相对最省事,最常用的办法是:
Win7的资源管理器中,右键,cygwin中那些没有操作权限的文件所在的文件夹
然后选择:"管理员取得所有权"
就会调出命令行,给该文件夹下所有的文件,都加上当前用户,即管理员,的所有权限。
然后就可以在Win7下编辑文件,保存文件了。
如之前教程:
Windows环境下的,基于Cygwin的Docbook开发环境的搭建
介绍的一样,其实是在Windows下的Cygwin中,去搭建Docbook的环境,
效果会比纯Windows环境下Docbook环境,更好,功能更强大,但是当然,也更加复杂。
crosstool-ng支持Cygwin环境,也可以在Cygwin下编译crosstool-ng:
Buildroot,截止目前(2013-09-03),官网是不支持Cygwin环境的
但是,经过一番研究后发现,现在最新版本的Buildroot,好像已经有人成功在Cygwin上编译了。
所以,后来自己也就去折腾了,感兴趣的可以去看看: