需要部署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
有四个特殊条目:
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 包
我编译了 ghdl, which is written in Ada, with llvm 后端。我希望还有两个依赖项,例如 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 目录复制到包含您的可执行文件的目录中。重复此操作,直到您的程序 运行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 的方法:
- 将 mingw\bin 文件夹复制到名为“temp”的文件夹。
- 再创建 2 个文件夹,“hold”和“needed”
- 将“temp”和“needed”放在路径上,将 mingw\bin 移出路径。
- 确保您的应用现在 运行s。我必须将 zlib.dll 放在应用程序的文件夹中。
- 系统地将文件从“temp”移动到“hold”以查看应用程序需要哪些 dll 到 运行。确定所需的 dll 后,将其放入“所需”文件夹中。
- 还完成创建命令 window 的过程,将路径设置为仅“需要”并再次检查应用程序是否 运行s。
7、玩得开心,再繁琐的工作都难以想象。
我在 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
有四个特殊条目:
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 包
我编译了 ghdl, which is written in Ada, with llvm 后端。我希望还有两个依赖项,例如 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 目录复制到包含您的可执行文件的目录中。重复此操作,直到您的程序 运行s 成功。请注意,我假设 MSYS2 或其他具有类似 DLL 的程序不在您的 PATH 中。您可能希望暂时减少 PATH 中的文件夹数量,以确保正确执行此操作。例如,您可以在 运行ning set PATH=
.
我经常使用的另一种方法是在Dependency Walker中打开我的可执行文件,然后查看它直接依赖哪些DLL。
请注意,在极少数情况下,您的 DLL 可能会在 运行 时间而不是程序启动时加载。我上面提到的方法无法检测到这一点,也没有通用的机制来检测。
问题中添加的新问题的扩展答案
文件libstdc++-6.dll
是GCC的libstdc++。它实现了 C++ 标准库,提供了 std::string
之类的东西。 "VC++ 6.0 redistributable" 可能是一些 Microsoft 产品,非常不同。
你的第二个问题不是问题。也许有些库是静态链接的而不是动态链接的。
我不知道有什么好的方法可以读取像libgrt.a
这样的静态库文件的依赖关系。静态库只是一堆尚未链接的对象,因此静态库只有它需要的未定义符号列表,但它不知道哪个共享库或静态库最终会提供这些符号。我建议将静态库编译成可执行文件。
这是我从 mingw 获取我需要的 dll 的方法:
- 将 mingw\bin 文件夹复制到名为“temp”的文件夹。
- 再创建 2 个文件夹,“hold”和“needed”
- 将“temp”和“needed”放在路径上,将 mingw\bin 移出路径。
- 确保您的应用现在 运行s。我必须将 zlib.dll 放在应用程序的文件夹中。
- 系统地将文件从“temp”移动到“hold”以查看应用程序需要哪些 dll 到 运行。确定所需的 dll 后,将其放入“所需”文件夹中。
- 还完成创建命令 window 的过程,将路径设置为仅“需要”并再次检查应用程序是否 运行s。 7、玩得开心,再繁琐的工作都难以想象。