MinGW需要部署哪些文件?

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

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

我也不会要求用户安装MSYS2和MinGW64,因为将它安装在Windows机器上是一个噩梦。 软件包pipe理员(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包…
  • 我用llvm后端编译了用Ada编写的ghdl 。 我希望在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)

首先,确保您实际上正在构建本地(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 redistributable”将是一些微软产品,这是非常不同的。

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

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