搭建你自己的 MinGW 环境 - 张再筵的博客

/ 1评 / 0

前言

目前的 MinGW 发行版要么没有更新(官方 MinGW-w64)、要么没有免安装版本(TDM-GCC)、要么缺少 GDB 的 Pretty-Printing(WinLibs)。所以我萌生了手动搭建 MinGW 的想法。

经过长达十多天的探索,终于成功搭建出了完整的 MinGW。现将过程陈述于下。

过程

(不保证所有人都能按照此说明搭建成功)

基本配置

64 位的 Windows 系统,以及至少 30 GB 空间(越大越好)。(显然,性能越高越好)

获取 MSYS2

因为你需要一个在 Windows 环境下的 Bash 兼容 Shell,所以这里用到的是 MSYS2。

前往官网下载并安装 MSYS2。将安装位置选择在拥有足够空间的磁盘上。然后,按照官方的说明,在 msys2.exe 中执行软件包更新:

pacman -Syu # 执行后窗口将退出,此时重新启动 msys2.exe
pacman -Su

获取依赖包

通过 pacman 安装以下软件包:

pacman -S lndir git subversion tar zip p7zip make patch automake autoconf libtool flex bison gettext gettext-devel wget sshpass texinfo autogen dejagnu

获取构建脚本

定位到 home 目录,并下载 mingw-builds 脚本。这个是 MinGW-w64 官方维护者 niXman 所写的:

cd
git clone https://github.com/niXman/mingw-builds.git -b develop

注意选用 develop 分支而非 master。

我使用的版本为 0f20ed4,不保证将来更新的版本完全符合下面的流程。

你可以前往 mingw-builds/library/config.sh,将变量 MINGW_W64_PKG_STRING 改成你的名字——这样编译出来的 GCC 版本中将会留下你的名字!

开整!

回到 mingw-builds 目录,然后开整:

cd ~/mingw-builds
# 64 位
./build --mode=gcc-12.1.0 --arch=x86_64 --exceptions=seh --threads=posix --enable-languages=c,c++ --jobs=6 --cflags='-Wno-format'
# 32 位
./build --mode=gcc-12.1.0 --arch=i686 --exceptions=dwarf --threads=win32 --enable-languages=c,c++ --jobs=6 --cflags='-Wno-format'

其中它们的含义是:

参数 说明
--mode=gcc- 版本:搭建哪个版本的 GCC 。
--arch= 目标架构:x86_64 (64 位)或 i686 (32 位)。
--exceptions= 异常处理模型:seh 或 dwarf 或 sjlj。通行的做法是 64 位用 seh,32 位用 dwarf 。
--enable-languages= 生成哪些语言的编译器:从 ada,c,c++,fortran,objc,obj-c++ 中选择若干。
--jobs= 设置 make 时多核并行数。
--cflags= 设置编译 C 时的参数:如果不加 -Wno-format 会在编译 GCC 时出现错误。

还有这些常用参数:

参数 说明
--buildroot= 设置构建路径。默认是在 ~
--bootstrap 编译 GCC 时自举。
--fetch-only 只下载解压源代码,不构建。
--bin-compress 将编译完成的 MinGW 自动打成压缩包。
--help 查看全部参数的含义。

这个脚本甚至还提供了自动上传至 SourceForge 的功能,这里没有需求不再提及。

整个编译流程(不包括下载)大约需要数个小时的时间,取决于你的计算机性能。

如果下载出现问题,尝试切换网络环境。若手动下载,则在 MARKERS 文件夹内添加标记。 如果编译出现问题,我没有办法。尝试重新编译时,需要先重新配置。删除所有 config.cache 和 _configure.marker。

完成

编译完成后,$HOME/mingw-gcc-12.1.0/ 下面的 mingw32 和 mingw64 可供你享用了。

  1. Lahm说道:

    zyan太强了,牛逼!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注