用Cygwin编译独立的exe

时间:2010-09-03 22:57:16

标签: dll cygwin executable exe

我想用cygwin制作一个独立的exe。我有两个选择:

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

  2. 将cygwin1.dll与myprog.exe合并为
    如果我可以将cygwin1.dll与我的程序合并,我可以得到一个独立的exe。

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

    这些选项中的任何一个都可以吗?如果没有,这种困境有可能发生什么吗?感谢名单!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

尝试将-mno-cygwin作为编译器和链接器标志传递。如果你的程序要求很简单,这将避免依赖Cygwin库并创建一个独立的EXE。

答案 2 :(得分: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安装,您可以将其功能提供给/与没有Cygwin的其他Windows用户共享。但是 - 再一次,我指出并问你 - 了解Cygwin创作者的正确许可和法律并观察它们!