在没有安装cygwin的情况下运行在cygwin编译的应用程序

21

假设我有一个在Cygwin下编译的应用程序,我想分发这个应用程序,而不需要用户安装Cygwin。仅打包可执行文件和Cygwin DLL文件是否足够?


3
cygwin DLL是采用GPL许可,因此您还需要分发应用程序的源代码。 - anon
但是您可以购买Cygwin的商业许可证。 - Matthew Talbert
请详细说明——因为答案中似乎有两种解释。您是指技术上的(我需要分发哪些其他文件),还是法律上的(许可证允许我做什么)? - Wim
4个回答

7
事情已经改变了。Cygwin库现在属于较宽范围许可证(从FOSS到专有),即Lesser GPL(v3),这使得将它们与应用程序捆绑在一起成为可能。
阻碍的是,Cygwin中的POSIX仿真从本地Windows应用程序的角度来看有些过于夸张。
这就是我的Cygnal项目的用处。Cygnal代表CYGwin Native Application Library:它是Cygwin的一个兼容分支,可以更改或重新配置某些功能的行为,以符合Windows平台本地惯例。
一个基本的“Hello, World”Cygwin程序需要两个库。一个称为cyggcc_s-1.dll的GCC运行时和Cygwin DLL cygwin1.dll。Cygnal项目提供了后者的替代品。(32位版本可供下载)。
在 Cygwin POSIX 视图和 Windows 之间存在一个明显的不兼容性领域,那就是路径处理。Cygwin 对文件系统的视图是通过一个虚假的根目录 / 和它自己的内部“挂载表”来提供空间,如/cygdrive/proc/dev。Cygnal 摒弃了所有这些。路径是 Win32 路径。当前工作目录的行为类似于 Windows 的当前工作目录。驱动器与当前目录关联,并且驱动器相对路径(如 D:foo.txt)在 Cygnal 下工作。在 Cygnal 下,/dev/proc 仍然可用:它们被访问为特殊前缀 dev:/proc:/。不允许 chdir 进入这些目录:那不是本地的!在 Cygnal 下,如果您 chdirD:\wherever,那么您的当前驱动器是 D 驱动器,而路径 /foo\foo 指的是 D:\foo。Cygwin 的主 POSIX 根目录已经不存在了。
然而,使用Cygnal,您可以继续使用POSIX功能,从而开发跨平台程序,与使用MinGW或Microsoft Visual C/C++维护端口相比,代码少得多。例如:您可以使用VT100代码和termios编写Win32控制台应用程序。 相同的代码将在Unix上运行。 在Windows上不需要使用Win32控制台API,在POSIX系统上也不需要使用VT100/termios。另一个例子:对于线程,您只需使用POSIX线程。 使用pthread_create启动线程,使用pthread_mutex_lock锁定互斥锁等。 您的程序不需要可移植性抽象来转换为Win32或POSIX线程; 您只需使用POSIX即可。
在Cygnal中,uname函数返回的sysname带有CYGNAL前缀,而不是CYGWIN。通过这种方式,您的程序可以知道它正在Cygnal上运行,而不是Cygwin(或任何其他POSIX平台)。因此,您可以进行任何必要的调整:例如,如果您的程序需要/dev/null,则在Cygnal上可以查找dev:/null

6

你的应用程序是否真正需要Cygwin提供的Posix模拟功能?如果不需要,你可以使用-mno-cygwin标志进行编译,这样它就不会依赖于Cygwin,而是成为一个本地的Windows应用程序。通常,你只需要一个真正的shell(bash)来配置和构建你的应用程序,但实际上你并不需要Cygwin的Posix功能。

另一个选择是MSYS + MinGW,这是Cygwin的一个轻量级分支。它提供了一个默认生成本地Windows应用程序的编译环境。

第三个选项是使用Cygwin中的MinGW编译器。它们应该可以通过正常的Cygwin软件包管理器获得。然后你可以使用MinGW编译器为跨平台编译项目进行配置。


MSYS不是Cygwin的分支。 - anon
1
http://www.mingw.org/history http://en.wikipedia.org/wiki/MinGW#Comparison_with_Cygwin此外,MinGW邮件列表上的主要人员经常说MinGW / MSYS是cygwin的一个分支。 - Matthew Talbert
1
好的,我认为你在这里有点过于追求细节了;尽管如此,我已经编辑了我的帖子以避免这个问题。不过,msys-1.0.dll会是cygwin.dll的功能等效物,对吗?MinGW更多地是编译器和其他可以在bash shell之外使用的工具,而msys提供了一个bash shell和(有限的)posix仿真。 - Matthew Talbert

2
通常是可以的。但请确保在公共位置(Windows\System32)安装Cygwin DLL,因为如果在同一台机器上加载多个版本的DLL,则该DLL会表现得非常糟糕。

1
GPL链接和派生作品 - Kristopher Ives
1
这个问题没有说明作者不会发布代码。许多实用程序确实捆绑了cygwin1.dll。其中一个例子是cntml:http://cntlm.sourceforge.net/。 - brianegge

-1
你可以尝试将所有内容编译为静态文件。这样就可以在没有库的情况下运行所有内容(因为它们已经被包含在二进制文件中)。 但是这也意味着,如果cygwin需要使用不同或更新的动态链接库,则该方法可能无法在所有平台上正常工作。

那行不通:https://dev59.com/xXRC5IYBdhLWcg3wUfJ2 - Hut8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接