在Windows上用过Cygwin的人都很清楚一点, 所有基于Cygwin的项目在底层都必须依赖于cygwin1.dll这个文件, 而且任何以Cygwin环境来构建的软件在运行时也必须依赖cygwin1.dll。因此, 对于想让软件实现静态编译的人来说, 摆脱对cygwin1.dll的依赖便成了一个头疼的问题。
关于去除对cygwin1.dll文件依赖这个问题, Cygwin的明确说明不可以, 而且这还涉及到Cygwin的的问题。去网上搜索一下就可以发现, 在老版本的Cygwin中使用-mno-cygwin参数就可以解决问题了, 但是对于现在使用的版本来说, 这个参数是为无效的。大家普遍的解决办法就是, 要不就带着cygwin1.dll运行, 要不就用MinGW工具链来编译。难道就没有其他的办法了吗?
现在, 我们来仔细分析一下这个问题。如果软件源码能用MinGW工具链来构建, 那理所当然是最好的了, 完全可以不依赖cygwin1.dll。如果无法使用MinGW构建, 那么只有以下几种情况:
- 采用了Linux的API, 或者系统调用是符合POSIX标准的, 而Windows上并不具备这样的调用方式
- 软件使用了一些无法跨平台的库
- 代码是与具体的平台相关的, 无法实现跨平台移植
对于2和3, 到目前为止还真的没有什么特别好的解决方案, 但是对于1, 还是可以去克服的, 具体方法也可以分为几种:
- 将Linux(POSIX)的API调用换成标准的Windows调用,
- 从底层去实现一遍代码中所调用的LINUX(POSIX)函数。
在Windows中, 某些API是与POSIX标准所兼容的, 所以方法1可以去试一试。至于方法2, 一方面可以自己去试着封装Windows底层的API然后调用, 另一方面也可以去参照现成的代码稍作修改后调用。但是存在的最大的不足之处就在于, 某些API调用如Linux下的fork(), 在Windows下面就较难去通过修改代码实现。
因此, 不是说, 所有的软件, 在所有的情况下, 都能够摆脱对cygwin1.dll文件的依赖的。
在最后, 与大家分享一些项目, 可以帮助大家把项目从Linux方便的移植到Windows上面:
- (the Posix-over-Win32 layer)
- (A C runtime library for Windows that extends the MS libc by providing features defined in the POSIX standard and the Single Unix Specification)
- (GNU portability library )