使用Cygwin编译独立可执行文件

8
我想用cygwin制作一个独立的exe文件,有两种选择:
  1. 静态链接cygwin1.dll
    如果我能静态链接cygwin1.dll,那么我就可以得到一个独立的exe文件。

  2. 将cygwin1.dll与myprog.exe合并
    如果我能将cygwin1.dll与我的程序合并,那么我就可以得到一个独立的exe文件。

请不要建议我使用IlMerge。这不起作用,因为我没有用.NET编译我的程序。

这些选项中是否有任何一种可行?如果没有,这个困境中还有什么是可能的吗?谢谢!


我理解您实际上需要使用CYGWIN.DLL提供的服务,而仅仅使用-Mno-cygwin(或MinGW)对您来说行不通? - RBerteig
我不知道。我正在使用GCJ,但是我无法让mingw附带的GCJ工作。 - Leo Izen
3个回答

4
尝试将-mno-cygwin作为编译器和链接器标志传递。如果您的程序要求足够简单,则可以避免依赖Cygwin库并创建独立的EXE文件。

4
其他帖子已经表明,这个方法已经不再有效了,考虑到最近的读者,请知悉该功能已被弃用。 - Vercingatorix

3
我能看到你可能会考虑两种合理的可能性。一种是使用不同的编译器(例如MinGW - 无论哪种,只要它不需要cygwin)构建一个存根可执行文件,以将主可执行文件和cygwin.dll解压缩到临时目录中,然后生成该可执行文件。要仅分发单个可执行文件,您需要将主可执行文件和cygwin.dll添加为二进制资源到“存根”中。这有点丑陋,但相当简单。
另一种选择是获取cygwin源代码并将其构建为静态库。至少在理论上,这应该更干净 - 但无疑也需要更多的工作。让它构建为纯静态代码而不是DLL几乎肯定需要一些工作,尽管很难猜测需要多少工作。浏览一下,似乎很不可能是几个小时的快速工作,或者像那样的任何事情(除非我错过了已经支持静态构建的东西)。

2

Jerry的更精确的回答。

下面描述的过程应该与您的权利和许可法进行对比!我知道它可以工作,但分发结果的权利(甚至执行该过程的权利)可能受到Cygwin许可证的限制。这是因为您的应用程序仍然会引用Cygwin(即使它是无用的-但仍然在您的应用程序中)

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

在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安装,你可以向其他Windows用户展示其功能/共享它。但是 - 再次指出并询问您 - 要注意Cygwin创建者的适当许可证和法律,并遵守它们!

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