cygwin与mingw

Cygwin

cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的 自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的 应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行 嵌入式系统开发,非常有用。随着 嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。

1 简介

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等负责维护。 [1] cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被 Redhat收购)。

 cygwin

它对于学习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-5、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:WinNTsystem32;C:WinNT)转换成unix格式(e.g., /WinNT/system32:/WinNT)。如果想在不运行bash的时候也能够使用cygwin工具集,PATH起码应该包含x:cygwinbin,其中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目录 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:cygwinbin on /usr/bin type system (binmode) f:cygwinlib 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:cygwinbin转为/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,功能强大,可以用来做CC++开发。Eclipse开发CC++,需要用到CDT 插件,就可以利用Cygwin开发一些linux移植windows的开发,或者 交叉编译( 微软的VC 编译器不提供此功能)。如今比较火爆的Android NDK开发,如果在windows平台下就必须使用Cygwin。而且CDT 插件使用注册表发现Cygwin软件的安装位置,如果使用Eclipse 软件开发的话,Cygwin在安装的时候就不用配置任何的 环境变量,非常方便。 但是随着Cygwin更新到1.7,CDT 插件工作开始不正常,最明显的两个症状是:1.console无输出,2.按住ctrl点击,很多标准对象找不到对应的头文件。 解决方法:打开eclipse,windows->preferences->CC++->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 版本发布

2012年10月21日,Cygwin 1.7.17 发布 – Windows下的Linux开发。 [2]

官方网站:

http://www.cygwin.com/

mingw

MinGW 是一个可自由使用和自由发布的Windows特定 头文件和使用GNU工具集导入库的集合,允许你在 GNU/ Linux和 Windows平台生成本地的Windows程序而不需要第三方C运行时库。

1 MinGW简介

MinGW 是一个可自由使用和自由发布的Windows特定 头文件和使用GNU工具集导入库的集合,允许你在 GNU/ Linux和 Windows平台生成本地的Windows程序而不需要第三方C运行时库。 MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用 微软的标准C运行时间库( MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时间,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时间扩展,与基本运行时间相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 Windows API功能。

cygwin与mingw

2 安装使用

MinGW虽然附带支持系统剪切板的 VIM,但是使用体验相对GNU/Linux差很多,所以以 Dev-C++作为编辑器为宜。需要不同头文件和链接库,可以简单地复制到MinGW32相应目录下以避免头文件和链接库位置设置。 @echo off
  set CLASSPATH=.;%~dp0JDKlib;%~dp0JDKlibtools.jar;%~dp0JDKlibdt.jar
  set PATH=%PATH%;%dp0DEV-CPP;%dp0DEV-CPPMinGW32bin;%dp0DEV-CPPMinGW32gitbin;%dp0DEV-CPPMinGW32gitlibexecgit-core;%dp0DEV-CPPMinGW32gitlibexecgnupg;%dp0DEV-CPPMinGW32gitsharevimvim73;%~dp0JDKbin
  cd /d %USERPROFILE%Desktop && start “” devcpp
  @echo on

3 版本发布

2010年06月09日,MinGW 2.14 发布,该版本修正了下载错误的问题,同时几乎升级了所有的依赖 软件包到最新版本,新增对 libarchive,libgee,xvidcore 包的支持。 2010年06月18日,MinGW 2.15 发布,跨平台编译环境,该版本修正了由 Qt项目引起的下载错误,另外所有相关的包都升级到了最新版本。 2010年12月13日,MinGW 2.17 发布。 2011年03月20日,MinGW 2.19 发布,该版本改进内容: 1. 改进了下载机制 2. A CMake toolchain file is now provided to simplify cross-compiling projects that use CMake. 3. 不再支持 Lenny (GNU/Linux老稳定版本) 4. gtk 包改名为 gtk2. 5. 更新几乎所有的包到最新的版本 6. 支持下列包: dbus, graphicsmagick, libical, liboauth, physfs, and vigra. boost::filesystem users should note that version 3 is a major revision and now the default in 1.46。 2011年06月09日,MinGW 2.21 发布,该版本修复了很多包中的一些小bug,并升级几乎所有的包到最新的版本;而 gtkmm 和 gtksourceviewmm 重命名为 gtkmm2 和 gtksourceviewmm2 ;增加对 libass、poco和 t4k_common 包的支持。

官方网站:

http://www.mingw.org/

 

上文来自:百度百科

来源:zhouschina

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年11月3日
下一篇 2013年11月3日

相关推荐