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

时间:2009-12-30 16:26:48

标签: cygwin

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

4 个答案:

答案 0 :(得分:4)

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

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

第三种选择是使用Cygwin本身的MinGW编译器。它们应该通过普通的Cygwin包管理器提供。然后,您将使用MinGW编译器配置项目以进行交叉编译。

答案 1 :(得分:4)

事情发生了变化。 Cygwin库现在属于Lesser GPL(v3),它可以将它们与从FOSS到专有许可的各种许可证的应用程序捆绑在一起。

阻碍Cygwin中的POSIX仿真从本机Windows应用程序的角度来看有点太过分了。

这是我Cygnal项目的用武之地.Cygnal代表CYGwin Native Application Library:它是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

答案 2 :(得分:2)

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

答案 3 :(得分:-1)

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