【问题标题】:What files of MinGW need to be deployed?MinGW需要部署哪些文件?
【发布时间】:2017-08-02 04:38:30
【问题描述】:

我在 Windows 上使用 gcc-6.3.0 和 gcc-gnat-6.3.0 在 MinGW64 (MSYS2) 中编译了一个 Linux 软件。我想组装一个包含所有必要文件的安装程序包或 zip 文件。目标机器需要 MinGW 的哪些部分?

我不想发布完整的 MSYS2/MinGW64,因为它有 3 GiB!可执行文件只有 10 MiB。

我也不会要求用户安装 MSYS2 和 MinGW64,因为在 Windows 机器上安装它是一场噩梦。包管理器(pacman)对普通用户不友好/不可用。


编辑 1:

通常,MinGW64 不在我的 PATH 中。我有一个脚本来添加它,具体取决于所选的 MinGW 版本 32 与 64。用于编译程序的 GCC 来自 mingw32 或 mingw64 目录。

我将二进制文件复制到一个单独的目录:C:\Tools\GHDL\0.34dev-mingw64-llvm\bin

我使用ldd.exe 来检查可执行文件:

C:\msys64\usr\bin\ldd.exe C:\Tools\GHDL\0.34dev-mingw64-llvm\bin\ghdl.exe
    ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77020000)
    kernel32.dll => /c/Windows/system32/kernel32.dll (0x76f00000)
    KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcf20000)
    ADVAPI32.dll => /c/Windows/system32/ADVAPI32.dll (0x7fefd6a0000)
    msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefd130000)
    sechost.dll => /c/Windows/SYSTEM32/sechost.dll (0x7feff310000)
    RPCRT4.dll => /c/Windows/system32/RPCRT4.dll (0x7fefe450000)
    SHELL32.dll => /c/Windows/system32/SHELL32.dll (0x7fefe580000)
    SHLWAPI.dll => /c/Windows/system32/SHLWAPI.dll (0x7fefe120000)
    GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefda60000)
    USER32.dll => /c/Windows/system32/USER32.dll (0x76e00000)
    LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd110000)
    USP10.dll => /c/Windows/system32/USP10.dll (0x7fefd5d0000)

C:\msys64\usr\bin\ldd.exe C:\Tools\GHDL\0.34dev-mingw64-llvm\bin\ghdl1-llvm.exe
    ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x77020000)
    kernel32.dll => /c/Windows/system32/kernel32.dll (0x76f00000)
    KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefcf20000)
    ??? => ??? (0x6fe40000)
    libstdc++-6.dll => /c/Program Files/gettext-iconv/libstdc++-6.dll (0x6fc40000)
    libgcc_s_sjlj-1.dll => /c/Program Files/gettext-iconv/libgcc_s_sjlj-1.dll (0x6cec0000)
    msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefd130000)
    libwinpthread-1.dll => /c/Program Files/gettext-iconv/libwinpthread-1.dll (0x64940000)
    USER32.dll => /c/Windows/system32/USER32.dll (0x76e00000)
    GDI32.dll => /c/Windows/system32/GDI32.dll (0x7fefda60000)
    LPK.dll => /c/Windows/system32/LPK.dll (0x7fefd110000)
    USP10.dll => /c/Windows/system32/USP10.dll (0x7fefd5d0000)

我假设,第一个可执行文件 ghdl.exe 没问题,因为它只引用 Windows DLL。第二个可执行文件ghdl1-llvm.exe 有四个特殊条目:

  • libstdc++-6.dll => /c/Program Files/gettext-iconv/libstdc++-6.dll
  • libgcc_s_sjlj-1.dll => /c/Program Files/gettext-iconv/libgcc_s_sjlj-1.dll
  • libwinpthread-1.dll => /c/Program Files/gettext-iconv/libwinpthread-1.dll
  • ??? => ???

问题:

  • 第一个意思是说,用户需要一个 C++ 包吗?这是 VC++ 6.0 可再发行版吗?
    否则,Linux 上有一个 gettext 包...
  • 我编译了,它是用Ada编写的,带有后端。我希望还有两个依赖项,例如在 Linux 上:

    • llvm 3.8
    • libgnat 6.3.0
  • OTOH,GHDL 也有一个libgrt.a 文件。如何从该文件中读取依赖项?


编辑 2:

哦,我认为编辑 1 中存在绑定错误。
如果我在 MinGW64 控制台中运行 ldd,我会看到 gettext 绑定到其他文件...

例如libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)

【问题讨论】:

    标签: ghdl llvm windows package installation mingw-w64 msys2


    【解决方案1】:

    首先,确保您实际构建的是本机 (MinGW) Windows 应用程序。您使用的编译器应该位于/mingw64/bin//mingw32/bin。运行which gcc 以确保您使用的是正确的编译器。很多 MSYS2 问题归结为人们不知道使用哪个编译器,所以我总是提到它。

    您需要的 DLL 取决于您的程序使用的库以及它的编译方式。所以我不能只告诉你你需要什么 DLL。相反,我会帮你自己解决。

    解决这个问题的实验方法是只取你编译的可执行文件,将它移动到 MSYS2 之外的不同文件夹,然后尝试通过双击它来运行它。它可能会抱怨缺少一些 DLL。将该 DLL 从 MSYS2 内的相应 bin 目录(/mingw64/bin/mingw32/bin)复制到包含可执行文件的目录中。重复此操作,直到您的程序成功运行。请注意,我假设 MSYS2 或其他具有类似 DLL 的程序不在您的 PATH 中。您可能希望暂时减少 PATH 中的文件夹数量,以确保您正确执行此操作。例如,您可以在运行set PATH= 后尝试从命令提示符运行程序。

    我经常使用的另一种方法是在Dependency Walker 中打开我的可执行文件,看看它直接依赖于哪些DLL。

    请注意,在极少数情况下,您的 DLL 可能会在运行时而不是在程序启动时加载。我上面提到的方法无法检测到这一点,也没有通用的机制可以做到这一点。

    添加到问题中的新问题的扩展答案

    文件libstdc++-6.dll 是GCC 的libstdc++。它实现了 C++ 标准库,提供了 std::string 之类的东西。 “VC++ 6.0 redistributable”是一些微软的产品,这是非常不同的。

    你的第二个问题不是问题。也许有些库是静态链接而不是动态链接的。

    我不知道有什么好的方法可以读取像libgrt.a 这样的静态库文件的依赖项。静态库只是一组尚未链接的对象,因此静态库只有它需要的未定义符号列表,但它不知道哪个共享库或静态库最终会提供这些符号。我建议将静态库编译成可执行文件。

    【讨论】:

    • 你好大卫。请根据您的输入查看我的扩展问题。
    • 我扩大了我的回答范围,包括对您自我第一次回答以来提出的新问题的回答。
    • 谢谢。我想我找到了所有需要的 DLL。静态文件不会带来新的依赖关系。 GHDL是一个模拟器,根据输入模型创建一个新的exe文件,然后执行。 LLVM 和类似的完全包含在可执行文件中。我从 MinGW 拨打了ldd 并看到了更好的绑定结果。最终解决方案有点离题,并写在此问题报告中:github.com/tgingold/ghdl/issues/318。 GHDL 需要一个 GCC。所以现在的问题是 MinGW 是什么 GCC :) 以及如何说服 GCC 所在的 GHDL。
    • 也许还值得一提的是,OP 可以进行静态构建而不是部署那些 DLL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多