代码之家  ›  专栏  ›  技术社区  ›  Leo Izen

用Cygwin编译独立exe

  •  8
  • Leo Izen  · 技术社区  · 14 年前

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

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

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

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

    这些选项有没有可能?如果不是的话,这种困境有什么可能吗?唐克斯!

    3 回复  |  直到 7 年前
        1
  •  3
  •   Jerry Coffin    14 年前

    我可以看到两种可能性,你可能认为是合理的。一种方法是用不同的编译器(例如MinGW——随便什么,这样就不需要cygwin)构建一个存根可执行文件来解压主可执行文件并cygwin.dll然后生成可执行文件。要只分发一个可执行文件,您需要添加主可执行文件和cygwin.dll将“存根”作为二进制资源。有点难看,但很直截了当。

    另一种选择是抓住 source to cygwin ,并将其构建为静态库。至少在理论上,这应该更干净——但毫无疑问,这也需要更多的工作。要将其构建为纯静态代码而不是DLL几乎肯定需要一些工作,尽管很难猜测需要多少工作。只是浏览一下,似乎不太可能是几个小时的快速工作,或者类似的工作(当然,除非我错过了一些支持静态构建的东西)。

        2
  •  3
  •   Edmund    14 年前

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

        3
  •  1
  •   David G    12 年前

    下面描述的程序应与您的权利和许可证法相冲突!我知道它可以工作,但分发结果(甚至执行过程)的权利可能(我真的觉得)受到Cygwin许可证的限制。这是因为您的应用程序仍将引用Cygwin(尽管它毫无用处,但仍在您的应用程序中)

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

    在cygwin控制台中,转到 C:\xxx\yyy\zzz

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

    获得应用程序使用的所有DLL。然后复制 所有列出的和cygwin专用的DLL。

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

    也许你将不得不重新编译你的项目与选择的种类 -L C:\xxx\yyy\zzz 差不多吧。注意你的信息源中的所有其他路径。

    因此,您的应用程序独立于Cygwin安装,您可以将其功能展示给没有Cygwin的其他Windows用户/与之共享。但是-我再一次指出并要求你-注意Cygwin创造者的适当许可和法律,并遵守它们!