2009-12-30 88 views
16

比方说,我有我的cygwin下编译的应用程序,我想分发应用程序,而无需用户安装cygwin。打包可执行文件和cygwin DLL足够了吗?运行的应用程序,在Cygwin中编译,而无需安装了cygwin

+3

Cygwin的DLL是GPL的,所以你也必须分发您的应用程序的来源。 – 2009-12-30 16:29:37

+0

但您可以购买Cygwin的商业许可证。 – 2009-12-30 18:27:08

+0

请详细说明 - 因为答案中似乎有两种解释。你的意思是技术上(我需要分发哪些*其他*文件),或者合法(许可证允许我做什么)? – Wim 2010-01-06 12:20:38

回答

2

通常,是的。虽然(Windows \ System32)确保将Cygwin DLL安装在公共位置,但是当它的多个版本加载到同一台机器上时,此DLL的行为非常糟糕。

+1

[GPL链接和衍生作品(http://en.wikipedia.org/wiki/GNU_General_Public_License#Linking_and_derived_works) – 2009-12-30 16:36:03

+1

问题未说明关于作者不释放任何代码。许多实用程序会捆绑cygwin1.dll。一个这样的例子是cntml:http://cntlm.sourceforge.net/。 – brianegge 2010-01-06 02:57:41

0

你可以尝试编译所有静态。这应该允许你运行一切,而不需要libs(因为它们已经在你的二进制文件中)。 但是,这也意味着它可能无法正常工作的所有平台上的cygwin是否需要不同的或较新的DLL。

+0

这将无法正常工作:http://stackoverflow.com/questions/340696/can-you-statically-compile-a-cygwin-application – Hut8 2013-07-24 15:20:36

3

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

另一种替代方案是MSYS + MinGW,它是Cygwin的轻量级叉子。这提供了一个默认生成本地Windows应用程序的编译环境。

第三个选择是从自身的Cygwin使用MinGW的编译器。它们应该可以通过普通的Cygwin软件包管理器来使用。然后,您将使用MinGW编译器配置项目进行交叉编译。

+0

MSYS不是cygwin的分支。 – 2009-12-30 18:08:42

+1

http://www.mingw.org/history http://en.wikipedia.org/wiki/MinGW#Comparison_with_Cygwin 另外,MinGW邮件列表上的主要人员经常说MinGW/MSYS是一个叉cygwin的。 – 2009-12-30 18:24:23

+0

MinGW不是MSYS – 2009-12-30 18:28:51

2

事情已经改变了。在Cygwin库目前正在较宽松GPL(V3),这使得它能够以落在下范围广泛的许可证,从FOSS到专有应用捆扎在一起。

什么阻碍的方式是,在Cygwin中的POSIX模拟从本地Windows应用程序的角度看需要的东西有点过分。

这是我Cygnal项目进来Cygnal公司代表Cygwin的原生应用程序库:这是一个简易的Cygwin兼容叉而改变,或在某些情况下,只需重新可以配置,某些功能的行为,以以符合Windows平台的本地惯例。

一个基本的“Hello,World”Cygwin程序需要两个库。一个GCC运行时称为cyggcc_s-1.dll和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