使用 Windows7已有一年多了,一日闲来无事,偶然发现 Windows 7 中的“打开关闭 windows 功能”中有一个“ 基于UNIX 的应用程序子系统 ”,很是好奇,就试着安装了一下,从官网下载了一个包Utilities and SDK for Subsystem for UNIX-based Applications_X86 ,大概 250MB ,安装完成后,果然很有效,系统多了一个 POSIX子系统 !而且该子系统提供了很多常用的 UNIX命令,包括 make 、 GCC 和 GDB 。那我们岂不是可以用这个 POSIX子系统 在 windows下开发 UNIX 环境程序了?恭喜你,答对啦!不过像 epoll 这样的函数并没有提供。该 POSIX子系统 应该只是提供了一个子集,方便开发人员来移植程序。
要了解更多关于 POSIX子系统 的介绍及安装方法,请点击这篇文章《初探Windows 7 POSIX 子系统》: http://soaspx.com/dotnet/service/service_20100426_3996.htm
安装完成后,打开C:/Windows/SUA 目录,里面的文件夹名称是不是很熟悉?这个子系统本身提供了开发工具 make、 GCC 和 GDB ,包括一些头文件(在 usr 目录下)。另外,如果安装有 Visual Studio ,并设置好了环境变量,在该子系统的 Cshell 中还可调用 VC 的命令行编译选项来编译程序!具体配置请参阅其帮助文档的“ Porting applications to the Subsystem for UNIX-based Applications ”的“ Compatibility issues ”项。
另外,系统还提供了一个“Visual Studio 调试程序扩展”,可以在安装有 Visual Studio 的机子上来调试 Unix 程序。不过要首先按上面的步骤在子系统中设置好 VS 环境变量,然后用 shell 命令生成 PDB 文件(该文件是 VS调试必须的 ),然后开始调试,步骤很麻烦,有兴趣的可以看一下,具体的操作步骤在帮助文档的“ Porting applications to the Subsystem for UNIX-based Applications ” ->“ Porting code ”-> “ Installing and Using the Microsoft Visual Studio Debugger Extension ”。
不过,想要用Visual Studio2008 来编译程序(注意,仅仅是编译!),则要修改几个头文件。将 C:/Windows/SUA/usr/include 目录下的头文件向你的 Visual Studio2008 的安装目录迁移。哪个不符合就迁移哪个。我试了一下,下面是我自己使用过程的小结:
1. 仅在C:/Windows/SUA/usr/include 存在的文件
对于这类文件,将C:/Windows/SUA/usr/include 目录中的 strings.h features.h netdb.h unistd.h signal.h 及文件夹 sys 、 netinet 、 netinet6 、 arpa 添加 到VS_DIR/VC/include 目录下。这时可以编译 socket 程序啦。
2. 在C:/Windows/SUA/usr/include 和 VS_DIR/VC/include 都存在的文件
这类文件,比如time.h ,为了不影响 VC 写的 windows 程序的正常使用,我采取的办法是修改 SUA 中的文件包含。将 time.h 文件更名为 timesua.h( 包括内部的预编译头! ) ,放在新增加的 VC/include/sys 目录中。同时,修改 <sys/time.h> 中的第 9 行 #include<time.h> 为: #include <sys/timesua.h> 即可。对于其它文件也可作类似处理,充分发挥你的想象力吧!
这样更改后,就可以借助Visual Studio2008 强大的功能来编写 Unix 下的程序了,并且可以“编译”来查找 语法错误 ,注意,仅仅是编译,由于缺少动态连接库,所以无法“连接”。
最后要说明的是,SUA 的 C shell 默认使用的 GCC 版本是 3.3 ,不过 SUA 还提供了 4.2 版本的 GCC ,要在 C shell 中使用 4.2 版本的 GCC ,请修改 C:/Windows/SUA/etc/csh.login 文件中 62 行和 180 行对应版本号即可。