需要部署MinGW的哪些文件?

What files of MinGW need to be deployed?

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

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

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


编辑 1:

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

我将二进制文件复制到一个单独的目录:C:\Tools\GHDL[=11=].34dev-mingw64-llvm\bin

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

C:\msys64\usr\bin\ldd.exe C:\Tools\GHDL[=10=].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[=10=].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 有四个特殊条目:

问题:


编辑 2:

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

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

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

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

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

之后尝试从命令提示符 运行ning 程序

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

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

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

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

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

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

这是我从 mingw 获取我需要的 dll 的方法:

  1. 将 mingw\bin 文件夹复制到名为“temp”的文件夹。
  2. 再创建 2 个文件夹,“hold”和“needed”
  3. 将“temp”和“needed”放在路径上,将 mingw\bin 移出路径。
  4. 确保您的应用现在 运行s。我必须将 zlib.dll 放在应用程序的文件夹中。
  5. 系统地将文件从“temp”移动到“hold”以查看应用程序需要哪些 dll 到 运行。确定所需的 dll 后,将其放入“所需”文件夹中。
  6. 还完成创建命令 window 的过程,将路径设置为仅“需要”并再次检查应用程序是否 运行s。 7、玩得开心,再繁琐的工作都难以想象。