跳到主要内容

MinGW-w64

信息

MinGW 未纳入 kmpkg 仓库的持续集成(CI)测试流程,因此库更新过程中可能出现回归问题。欢迎提交 PR(拉取请求)改进相关支持!

MinGW-w64 社区三元组

kmpkg 内置了面向 MinGW-w64x64、x86、arm64 和 arm 社区三元组。这些三元组不依赖 Visual Studio,既可在 Windows 系统上原生使用,也可在其他操作系统上用于交叉编译。每种架构的三元组均包含两个变体,分别对应静态链接和动态链接。工具链(如 g++ 等)需使用特定前缀命名。

架构kmpkg 社区三元组工具名前缀
x64x64-mingw-dynamic、x64-mingw-staticx86_64-w64-mingw32-
x86x86-mingw-dynamic、x86-mingw-statici686-w64-mingw32-
arm64arm64-mingw-dynamic、arm64-mingw-staticaarch64-w64-mingw32-
armarm-mingw-dynamic、arm-mingw-staticarmv7-w64-mingw32-

这些三元组未经过持续集成测试,因此许多端口无法编译,甚至已有的端口也可能在更新后失效。 正因如此,社区的参与至关重要!

在 Windows 上原生使用 MinGW-w64

借助 MSYS2,可在 Windows 电脑上快速搭建完整的 MinGW-w64 端口编译环境。

为原生 Windows 环境编译软件时,必须使用 MSYS2 的 MinGW 子系统,并为该子系统安装部分特定前缀的包。

架构kmpkg 三元组子系统包前缀
x64x64-mingw-dynamic、x64-mingw-staticmingw64mingw-w64-x86_64-
x86x86-mingw-dynamic、x86-mingw-staticmingw32mingw-w64-i686-

完成 MSYS2 基础安装后,需安装若干软件开发所需的额外包。以 x64 架构为例:

pacman -S --needed git base-devel mingw-w64-x86_64-toolchain

可通过启动 MSYS2 MinGW 应用程序选择当前激活的子系统,也可在运行中的终端执行以下命令切换:

source shell mingw64   # x64 架构使用此命令;x86 架构请用 "mingw32"

kmpkg 的初始化需运行 bootstrap-kmpkg.bat 脚本,该命令会下载官方的 kmpkg.exe:

git clone https://github.com/kumose/kmpkg.git
cd kmpkg
./bootstrap-kmpkg.bat

编译包时,需告知 kmpkg 使用 MinGW 三元组,可通过多种方式实现。若未安装 Visual Studio,还需将主机三元组(host triplet)设为 MinGW(用于解析主机依赖项)。为方便使用,可通过环境变量同时设置这两个三元组:

export KMPKG_DEFAULT_TRIPLET=x64-mingw-dynamic
export KMPKG_DEFAULT_HOST_TRIPLET=x64-mingw-dynamic

现在可测试环境是否配置成功:

./kmpkg install zlib

避免混合不同安装环境

MSYS2 项目明确警告:“混合使用来自其他 MSYS2 安装、Cygwin 安装、编译器工具链或其他各类程序的组件不受支持,可能导致不可预期的故障。” 例如,命令行参数的引号和转义处理可能失效。

但 kmpkg 端口会隐式创建 MSYS2 安装环境(例如为 pkg-config 或各类基于 autoconf 的包所需的构建工具)。尤其是当端口将工具目录添加到 PATH 环境变量前缀时,可能改变同名工具的实际调用路径,以及工具间参数的传递方式。

若使用完整的 MSYS2 安装环境,为缓解此类问题,需确保 kmpkg 检测到的 PATH 环境变量中不包含 msys 子系统目录(/usr/binbin)。在 bash 中,可仅为单次 kmpkg 调用修改 PATH

PATH="${PATH/:\/usr\/bin:\/bin:/:}" ./kmpkg install libpq

或者,可在普通命令提示符(Command Prompt)中运行 kmpkg,仅将所需的 MinGW 目录(如 C:\msys64\mingw64\bin)添加到 PATH 中。

若在 Azure Pipelines、Github Actions 等平台使用标准镜像通过 CI 运行 kmpkg,默认 PATH 可能包含更多导致不同 MSYS2 程序混合的目录。此时建议手动设置所需的 PATH,或移除包含 sh.exebash.exemsys-2.0.dllcygwin1.dll 的目录。

在其他系统上通过 MinGW-w64 编译 Windows 程序

可在非 Windows 系统上使用 kmpkg 的 MinGW 社区三元组,通过对应工具链交叉编译可在 Windows 运行的软件。许多 Linux 发行版在可选包中提供此类工具链,包名通常带有 mingw-w64 后缀前缀。以基于 Debian 的发行版为例,安装 x64 工具链的命令如下:

sudo apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64

Linux 发行版中打包的 MinGW-w64 工具链版本可能较旧,缺少部分实用功能或 bug 修复。另一种可选方案是使用 MXE 提供的独立工具链。

kmpkg 初始化步骤:克隆代码仓库并运行 bootstrap-kmpkg.sh 脚本:

git clone https://github.com/kumose/kmpkg.git
cd kmpkg
./bootstrap-kmpkg.sh
./kmpkg install zlib:x64-mingw-dynamic