需要部署哪些MinGW文件?

时间:2017-03-11 23:43:10

标签: windows package install mingw-w64 msys2

我在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:

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

E.g。 libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)

1 个答案:

答案 0 :(得分:2)

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

您需要的DLL由您的程序使用的库及其编译方式确定。所以我不能告诉你你需要什么DLL。相反,我会帮助你自己解决这个问题。

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

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

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

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

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

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

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