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

在未安装cygwin的情况下运行用cygwin编译的应用程序,cygwin,Cygwin,假设我有一个在cygwin下编译的应用程序,我想在没有用户安装cygwin的情况下分发该应用程序。打包可执行文件和cygwin DLL是否足够?正常情况下,是的。请确保将Cygwin DLL安装在公共位置(Windows\System32),但当在同一台计算机上加载多个版本时,此DLL的行为非常糟糕。您可以尝试将所有内容编译为静态。这应该允许您在不需要LIB的情况下运行所有内容(因为它们已经在二进制文件中)。 但这也意味着,如果cygwin需要一个不同的或更新的dll,它可能无法在所有平台上运行

假设我有一个在cygwin下编译的应用程序,我想在没有用户安装cygwin的情况下分发该应用程序。打包可执行文件和cygwin DLL是否足够?

正常情况下,是的。请确保将Cygwin DLL安装在公共位置(Windows\System32),但当在同一台计算机上加载多个版本时,此DLL的行为非常糟糕。

您可以尝试将所有内容编译为静态。这应该允许您在不需要LIB的情况下运行所有内容(因为它们已经在二进制文件中)。
但这也意味着,如果cygwin需要一个不同的或更新的dll,它可能无法在所有平台上运行。

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

另一种选择是+,它是Cygwin的轻型叉子。这提供了一个编译环境,默认情况下生成本机Windows应用程序


第三种选择是使用Cygwin本身的MinGW编译器。它们应该通过正常的Cygwin软件包管理器提供。然后,您可以使用MinGW编译器为交叉编译配置项目。

情况已经发生了变化。Cygwin库现在处于较低的GPL(v3)之下,这使得可以将它们与各种许可证下的应用程序捆绑在一起,从FOSS到专有许可证

阻碍的是Cygwin中的POSIX仿真与本机Windows应用程序的角度有点太远了

这就是我的项目的意义所在。Cygnal代表CYGwin本机应用程序库:它是CYGwin的一个插入式兼容分支,用于更改或在某些情况下简单地重新配置某些功能的行为,以符合Windows平台的本机约定

一个基本的“Hello,World”Cygwin程序需要两个库。一个名为
cyggcc_s-1.dll
的GCC运行时和Cygwin-dll
cygwin1.dll
。Cygnal项目提供了后者的替代品。(32位版本可供下载)

Cygwin POSIX世界视图和Windows之间不兼容的一个突出方面是路径处理。文件系统的Cygwin视图是通过一个假的
/
根目录和它自己的内部“挂载表”,它提供了
/cygdrive
/proc
/dev
等空间。辛格纳尔消除了这一切。路径是Win32路径。当前工作目录的行为类似于Windows当前工作目录。驱动器与当前目录相关联,驱动器相对路径如
D:foo.txt
在Cygnal下工作。在Cygnal下,
/dev
/proc
仍然可用:它们作为特殊前缀
dev:///code>和
proc:///code>访问。不允许
chdir
进入这些:这不是本机的!在Cygnal下,如果您
chdir
D:\where
,则当前驱动器是
D
驱动器,路径
/foo
\foo
请参考
D:\foo
。Cygwin的主POSIX根目录不见了

然而,使用Cygnal,您可以继续使用POSIX功能,与使用MinGW或Microsoft Visual C/C++维护端口相比,可以开发基于平台交换的代码更少的跨平台程序

例如:您可以使用VT100代码和
termios
编写Win32 console应用程序。相同的代码将在unix上运行。无需在Windows上使用Win32 console API,也无需在POSIX系统上使用VT100/
termios

另一个例子:对于线程,您可以只使用POSIX线程
pthread\u create
启动线程,
pthread\u mutex\u lock
锁定互斥体,依此类推。您的程序不需要对转换为Win32或POSIX的线程进行可移植性抽象;您只需使用POSIX即可


Cygnal中的
uname
函数报告带有
Cygnal
前缀的
sysname
,而不是
CYGWIN
。通过这种方式,您的程序可以判断它是在Cygnal而不是Cygwin(或任何其他POSIX平台)上运行的。因此,您可以进行任何必要的调整:例如,如果您的程序需要
/dev/null
,则可以在Cygnal上查找
dev:/null

cygwin DLL是GPL,因此,你还必须分发应用程序的源代码。但是你可以为Cygwin购买商业许可证。请详细说明——因为答案中似乎有两种解释。你的意思是技术上的(我需要分发哪些其他文件),还是法律上的(许可证允许我做什么)?问题没有说明作者没有发布代码的任何内容。许多实用程序确实绑定了cygwin1.dll。其中一个例子是cntml:.MSYS不是cygwin的分支。此外,MinGW邮件列表上的主要人物经常说MinGW/MSYS是cygwin的分支;尽管如此,我还是编辑了我的帖子以避免这个问题。不过,msys-1.0.dll在功能上等同于cygwin.dll,是吗?MinGW更多的是编译器和其他可以在bash shell之外使用的工具,而msys提供bash shell和(有限的)posix仿真。这不起作用: