将使用 MSYS2 和 MingW 构建的程序交付给最终用户的正确方法是什么?

Avi*_*ohn 8 c windows deployment mingw-w64 msys2

我正在使用 Msys2 和 MingW 在 Windows 上构建 C 应用程序。

该应用程序将交付给不精通技术的最终用户的桌面 Windows 计算机。对此我有两个问题:

  1. 将使用 Msys64 和 MingW 构建的 Windows 程序发送到未安装这些软件的其他 Windows 计算机的最佳实践方法是什么?互联网上和此处的一些消息来源表示,我们别无选择,只能将文件与其依赖的exeMingW 一起分发到同一目录中。或者,将与 MingWdll静态链接。但是,我想确定这些是否确实是这样做的标准方法。奇怪的是 MingW 没有更好的方法。exedll

  2. 假设所说的exe在某些时候也使用LoadLibraryAPI 来动态加载dll(想想插件系统)。这dll也是使用构建的MingW(在这种情况下,当然将与 一起运送给最终用户exe)。我需要做什么特殊的事情才能确保dll在未安装 MingW 的用户计算机上成功加载?

  3. 除了2:.lib在开发机器上编译期间和/或在终端机器上启动期间,所述DLL是否需要存在导入库()?

编辑:请让我澄清一下,我没有使用MSYS2 作为命令行 shell。gcc我通过 Windows直接使用 Mingw cmd,并且只是从 MSYS2 下载目录中获取了 Mingw。

M.M*_*M.M 7

我认为这个问题是关于 MSYS2 和 mingw-w64 的,因为没有 "msys64" 这样的东西。

MSYS2 提供三种不同的目标系统:

  • Windows 32 位
  • Windows 64 位
  • 系统2

其中每个在 MSYS2 安装下都有完全独立的开发工具和软件包的源代码树。

不要将其与不同的构建系统混淆——构建系统可以是 Win32 或 Win64。例如,如果您选择 Win64 作为构建系统并选择安装所有三个目标系统,那么您将拥有树msys64/mingw32msys64/mingw64msys64/usr

MSYS2 安装程序为您安装的每个目标创建启动脚本。


如果您的目标是 Win32 或 Win64,则编译后的二进制文件(exe 或 dll)可以作为独立产品分发。您可以使用 gcc 或 clang 进行静态构建,生成单个独立的可执行文件,也可以进行依赖于与可执行文件一起分发的 DLL 的构建。

二进制发行版的标准是包含它们需要但目标操作系统未提供的所有文件,这不是 mingw-w64 的特性。

MSDN 文档中LoadLibrary描述了搜索路径。

如果您以 MSYS2 为目标,则生成的二进制文件应该在 MSYS2 shell 下运行。该目标提供了一些 mingw-w64 不直接支持的 POSIX 功能。它可以被认为是 Cygwin 的一个分支。可以分发针对 MSYS2 的二进制文件以及从 MSYS2 安装复制的一堆 DLL,您可以使用依赖跟踪器识别这些 DLL。