2010-09-03 125 views
8

我想用cygwin编写独立exe文件。我有两个选择:用Cygwin编译独立exe文件

  1. Staticly链接cygwin1.dll
    如果我能静态链接cygwin1.dll,那么我就可以得到一个独立的exe文件。

  2. 与MYPROG.EXE
    合并cygwin1.dll如果我可以用我的程序合并cygwin1.dll时,我可以得到一个独立的exe文件。

不建议我使用IlMerge。这是行不通的,因为我没有用.NET编译我的程序。

是否有这些选项可能?如果不是,这种困境有什么可能吗?感谢名单!

+0

我认为你实际上需要CYGWIN.DLL的服务,并且只使用-Mno-cygwin(或MinGW)将不适合你? – RBerteig 2010-09-03 23:34:47

+0

我不知道。我正在使用GCJ,但是我无法得到与mingw一起工作的GCJ。 – 2010-09-04 12:38:24

回答

3

我可以看到你可能认为合理的两种可能性。一种方法是使用不同的编译器(例如MinGW - 无论如何不需要cygwin)构建一个存根可执行文件,将主可执行文件和cygwin.dll解压缩到一个临时目录中,然后生成该可执行文件。为了只分发一个可执行文件,你需要将主可执行文件和cygwin.dll作为二进制资源添加到“存根”中。这有点难看,但非常简单。

另一种方法是抓取source to cygwin,并将其构建为静态库。至少在理论上,这应该是更清洁 - 但它也无疑是更多的工作。将它构建为纯静态代码而不是DLL将几乎肯定需要一些工作,但很难甚至猜测多少。只是浏览一下,看起来不太可能是几个小时的快速工作,或者类似的事情(除非我错过了那些已经支持静态构建静态的东西)。

3

尝试通过-mno-cygwin作为编译器和链接器标志。如果你的程序需求足够简单,这将避免依赖于Cygwin库和创建一个独立的EXE。

+1

其他职位已经表明,这是行不通的,为了更新的读者。该功能现在已被弃用。 – eewanco 2015-10-14 15:30:09

1

杰瑞更精确的答案。

下面描述的程序应该面临您的权利和许可法!我知道它可以工作,但分发结果的权利(或者甚至执行程序)可能(并且我真的感觉到)受到Cygwin许可证的约束。那是因为你的应用程序仍然会参考Cygwin的(即使它是无用的 - 但仍然在你的应用程序)

假设hello.exe是你的伟大的应用程序的伟大工程目录在Cygwin下编译名C:\xxx\yyy\zzz\

在在cygwin控制台去C:\xxx\yyy\zzz并键入

objdump -p hello.exe | grep "DLL Name" 

您获得您的应用程序使用的所有DLL。然后将C:\xxx\yyy\zzz复制到列出的所有DLL,并为cygwin特定。

请注意,您的应用程序可能会调用其他应用程序(例如使用exec函数)---查找库应用程序使用并复制这些库以及此应用程序本身 - C:\xxx\yyy\zzz

也许你将不得不重新编译你的项目与种类-L C:\xxx\yyy\zzz左右的选项。观察源中的所有其他路径。

因此,您的应用程序独立于Cygwin安装,您可以将其功能展示给其他没有Cygwin的Windows用户。但是 - 我再次指出并问你 - 请注意Cygwin创作者的适当许可和法律,并观察它们!