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

cygwin1.dll 是 Cygwin 提供给 Windows的一个 POSIX 接口库,该库允许你在 Windows 上体验 UNIX/Linux 的感觉。

  • 双击桌面的Cygwin图标,即可启动Cygwin里的Bash。
  • 或者,你可将C:/Cygwin/bin加到%PATH%当中,您就可以直接在cmd.exe里面使用Linux命令了,比如less, cat, wc , wget
  • 如果您有一个Bash脚本,您可以直接用C:/Cygwin/bin/bash.exe X:/scripts/Monitor.sh的形式调用。

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

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

现在, 我们来仔细分析一下这个问题。如果软件源码能用MinGW工具链来构建, 那理所当然是最好的了, 完全可以不依赖cygwin1.dll。如果无法使用MinGW构建, 那么只有以下几种情况:

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

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

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

在Windows中, 某些API是与POSIX标准所兼容的, 所以方法1可以去试一试。至于方法2, 一方面可以自己去试着封装Windows底层的API然后调用, 另一方面也可以去参照现成的代码稍作修改后调用。但是存在的最大的不足之处就在于, 某些API调用如Linux下的fork(), 在Windows下面就较难去通过修改代码实现。

因此, 不是说, 所有的软件, 在所有的情况下, 都能够摆脱对cygwin1.dll文件的依赖的。

在最后, 与大家分享一些项目, 可以帮助大家把项目从Linux方便的移植到Windows上面:

  • 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 )

转载于:https://my.oschina.net/u/2368094/blog/730775

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值