MinGW-w64
MinGW 未纳入 kmpkg 仓库的持续集成(CI)测试流程,因此库更新过程中可能出现回归问题。欢迎提交 PR(拉取请求)改进相关支持!
MinGW-w64 社区三元组
kmpkg 内置了面向 MinGW-w64 的 x64、x86、arm64 和 arm 社区三元组。这些三元组不依赖 Visual Studio,既可在 Windows 系统上原生使用,也可在其他操作系统上用于交叉编译。每种架构的三元组均包含两个变体,分别对应静态链接和动态链接。工具链(如 g++ 等)需使用特定前缀命名。
| 架构 | kmpkg 社区三元组 | 工具名前缀 |
|---|---|---|
| x64 | x64-mingw-dynamic、x64-mingw-static | x86_64-w64-mingw32- |
| x86 | x86-mingw-dynamic、x86-mingw-static | i686-w64-mingw32- |
| arm64 | arm64-mingw-dynamic、arm64-mingw-static | aarch64-w64-mingw32- |
| arm | arm-mingw-dynamic、arm-mingw-static | armv7-w64-mingw32- |
这些三元组未经过持续集成测试,因此许多端口无法编译,甚至已有的端口也可能在更新后失效。 正因如此,社区的参与至关重要!
在 Windows 上原生使用 MinGW-w64
借助 MSYS2,可在 Windows 电脑上快速搭建完整的 MinGW-w64 端口编译环境。
为原生 Windows 环境编译软件时,必须使用 MSYS2 的 MinGW 子系统,并为该子系统安装部分特定前缀的包。
| 架构 | kmpkg 三元组 | 子系统 | 包前缀 |
|---|---|---|---|
| x64 | x64-mingw-dynamic、x64-mingw-static | mingw64 | mingw-w64-x86_64- |
| x86 | x86-mingw-dynamic、x86-mingw-static | mingw32 | mingw-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/bin、bin)。在 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.exe、bash.exe、msys-2.0.dll 或 cygwin1.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