MinGW需要部署哪些文件?

Pae*_*els 1 windows installation package mingw-w64 msys2

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

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

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


编辑1:

通常,MinGW64 不在我的路径中。我有一个脚本来根据所选的 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)
Run Code Online (Sandbox Code Playgroud)

我认为第一个可执行文件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
    • libnat 6.3.0
  • OTOH,GHDL 也有一个libgrt.a文件。如何从该文件中读取依赖项?


编辑2:

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

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

Dav*_*son 5

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

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

解决这个问题的实验方法是获取您编译的可执行文件,将其移动到 MSYS2 之外的其他文件夹,然后尝试通过双击来运行它。它可能会抱怨缺少某些 DLL。/mingw64/bin将该 DLL 从 MSYS2(或)内相应的 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. 静态库只是一组尚未链接的对象,因此静态库仅具有所需的未定义符号列表,但它不知道哪个共享库或静态库最终将提供这些符号。我建议将静态库编译成可执行文件。