在Windows中对程序运行时依赖cygwin1.dll文件的一点见解

在Windows上用过Cygwin的人都很清楚一点, 全部基于Cygwin的项目在底层都必须依赖于cygwin1.dll这个文件, 并且任何以Cygwin环境来构建的软件在运行时也必须依赖cygwin1.dll。所以, 对于想让软件实现静态编译的人来讲, 摆脱对cygwin1.dll的依赖便成了一个头疼的问题。html

关于去除对cygwin1.dll文件依赖这个问题, Cygwin的官网明确说明不能够, 并且这还涉及到Cygwin的许可证的问题。去网上搜索一下就能够发现, 在老版本的Cygwin中使用-mno-cygwin参数就能够解决问题了, 可是对于如今使用的版原本说, 这个参数是为无效的。你们广泛的解决办法就是, 要不就带着cygwin1.dll运行, 要不就用MinGW工具链来编译。难道就没有其余的办法了吗?函数

如今, 咱们来仔细分析一下这个问题。若是软件源码能用MinGW工具链来构建, 那理所固然是最好的了, 彻底能够不依赖cygwin1.dll。若是没法使用MinGW构建, 那么只有如下几种状况:工具

  1. 采用了Linux的API, 或者系统调用是符合POSIX标准的, 而Windows上并不具有这样的调用方式
  2. 软件使用了一些没法跨平台的库
  3. 代码是与具体的平台相关的, 没法实现跨平台移植

对于2和3, 到目前为止还真的没有什么特别好的解决方案, 可是对于1, 仍是能够去克服的, 具体方法也能够分为几种:.net

  1. 将Linux(POSIX)的API调用换成标准的Windows调用,
  2. 从底层去实现一遍代码中所调用的LINUX(POSIX)函数。

在Windows中, 某些API是与POSIX标准所兼容的, 因此方法1能够去试一试。至于方法2, 一方面能够本身去试着封装Windows底层的API而后调用, 另外一方面也能够去参照现成的代码稍做修改后调用。可是存在的最大的不足之处就在于, 某些API调用如Linux下的fork(), 在Windows下面就较难去经过修改代码实现。htm

所以, 不是说, 全部的软件, 在全部的状况下, 都可以摆脱对cygwin1.dll文件的依赖的。ci

在最后, 与你们分享一些项目, 能够帮助你们把项目从Linux方便的移植到Windows上面:get

  • PW32(the Posix-over-Win32 layer)
  • Plibc(A C runtime library for Windows that extends the MS libc by providing features defined in the POSIX standard and the Single Unix Specification)
  • gnulib(GNU portability library )
相关文章
相关标签/搜索