0%

MinGW-w64 & MSYS2 指北

Windows 上编译 GUNC/C++ 代码,需要用到 MinGW-w64 的编译环境。

MinGW-w64 的全称是 Minimalist GNU for Windows 64-bit,其主要目标是提供一个最小化的、可以运行 GNU 工具链的 Windows 环境。它包括了许多常见的 GNU 工具和库,如 GCC(GNU Compiler Collection,GNU 编译器集合)GDB(GNU Debugger,GNU 调试器) 等,以及一个 Windows 兼容的 POSIX API 实现。这些工具允许开发者在 Windows 上编写、编译和调试 C/C++ 等编程语言的代码,同时也能运行许多在 Unix 系统上编写的脚本和工具。

MinGW-w64MinGW 的升级版,MinGW 是一个 GNU 编译器链,它提供了 CC++ 编译器,以及一些其他工具,如 makegdb 等。MinGW-w64MinGW 的一个分支,它提供了与 MinGW 相同的功能,但同时支持 64 位32 位 的编译。

MinGW-w64

分发形式

MinGW-w64 的发行商有很多,有的提供仅包含 GUN 工具链的压缩包;有的提供的是类 Linux 的终端环境,MinGW-w64 只是其中的一个软件包的存在。

具体可以在 https://www.mingw-w64.org/downloads/ 查看。

安装方式

单压缩包的版本部署相对简单,下载之后解压到本地,配置 Path 环境变量之后就可以使用了。

各种类 Linux 终端环境安装一般会复杂一点,安装之后一般都不会存在 GUN 工具,需要使用对应的包管理器来安装。

CygwinMSYS2 的区别

CygwinMSYS2Widnows 常用的两个 Linux 模拟环境。它们都提供了 MinGW-w64 软件包支持,单两者的用途不同:

  • Cygwin
    Cygwin 专注于按原样在 Windows 上构建 Unix 软件,允许在 Windows 上运行原生的 GNU 命令行工具。
  • MSYS2
    MSYS2 专注于构建针对 Windows API 构建的本机软件。并且 MSYS2 提供了 pacman 包管理器,可以安装各种 GNU 软件包。

交叉编译支持

MinGW-w64 不仅仅只是用在 Windows上,在其他的操作系统中(比如 LinuxMacOS 等),可以通过 MinGW-w64 编译出 Windows 上能运行的可执行文件。

MSYS2

由于主要场景是在 Windows 下编译 GUN 的代码,所以常用的环境是 MSYS2 或压缩包形式分发的 MinGW-w64 工具集。

这里记录一下 MSYS2 安装以及调教过程。

安装

MSYS2 的安装过程很简单,在官网 https://www.msys2.org/ 下载安装包,运行安装即可。

国内有很多 MSYS2 镜像站,如果下载不动可以试试:https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/x86_64/

另外安装时因为国内访问默认的软件包仓库速度过慢,可能会存在卡进度的现象,建议断网安装。

在安装程序卡在 ==> Updating trust database... 时就可以继续做下一步配置了。

配置镜像

考虑到国内的网络环境,首先配置一下镜像源,在 MSYS2 终端中执行以下命令切换镜像源(任选一个):

  • 清华大学
    sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
    
  • 阿里云
    sed -i "s#https\?://mirror.msys2.org/#https://mirrors.aliyun.com/msys2/#g" /etc/pacman.d/mirrorlist*
    
  • 腾讯云
    sed -i "s#https\?://mirror.msys2.org/#https://mirrors.cloud.tencent.com/msys2/#g" /etc/pacman.d/mirrorlist*
    
  • 华为云
    sed -i "s#https\?://mirror.msys2.org/#https://mirrors.huaweicloud.com/msys2/#g" /etc/pacman.d/mirrorlist*
    

之后就可以同步软件源并安装软件了:

pacman -Su

安装基础软件

pacman -S bash-completion git

bash-completionTab 佬必备。
git:平替 WindowsGit

设置别名

tee > /etc/profile.d/alias.sh <<EOF
alias cp='cp'
alias mv='mv'
alias rm='rm'
alias ll='ls -lh -F --color=auto --time-style=long-iso'
alias la='ls -lhA -F --color=auto --time-style=long-iso'
alias lt='ls -lht -F --color=auto --time-style=long-iso'
alias lat='ls -lhAt -F --color=auto --time-style=long-iso'
EOF

链接用户目录

MSYS2 的用户目录默认为 C:\msys64\home\{username},但是 Windows 的用户目录为 C:\Users\{username}

为了将来顺利在 Git for windows 之间平滑过渡,也配置一下映射:

tee > /etc/nsswitch.conf <<EOF
# Begin /etc/nsswitch.conf

passwd: files db
group: files # db

db_enum: cache builtin

db_home: env windows cygwin desc
db_shell: env windows # cygwin desc
db_gecos: env # cygwin desc

# End /etc/nsswitch.conf
EOF

这个配置正是来自于 Git for windowsC:\Program Files\Git\etc\nsswitch.conf

添加快捷启动

想要实现在任何目录快速唤起 MSYS2,可以按照如下操作。

C:/Windows/ 创建一个 MSYS.bat,内容如下:

@echo off
set MSYSTEM=MINGW64
set CHERE_INVOKING=1

if "%~1"=="" (
    C:\msys64\usr\bin\bash.exe --login
) else if exist %1\ (
    cd /d %1
    C:\msys64\usr\bin\bash.exe --login
) else (
    C:\msys64\usr\bin\bash.exe --login %1
)

这里默认使用的 MINGW64 子系统。
C:\msys64\msys2_shell.cmd -help

之后在命令行或者资源管理器中输入 MSYS 就可以快速唤起 MSYS2 终端。

添加右键菜单

  • 添加
# 禁用 UNC 路径检查
reg add "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v "DisableUNCCheck" /t "REG_DWORD" /d "1" /f
# 打开文件
reg add "HKEY_CLASSES_ROOT\*\shell\MSYS2" /t REG_SZ /d "Open in MSYS2" /f
reg add "HKEY_CLASSES_ROOT\*\shell\MSYS2" /v "Icon" /t REG_SZ /d "C:\msys64\mingw64.ico" /f
reg add "HKEY_CLASSES_ROOT\*\shell\MSYS2\command" /v "" /t REG_EXPAND_SZ /d "\"C:\Windows\MSYS.bat\" \"%1\"" /f
# 目录打开
reg add "HKEY_CLASSES_ROOT\Directory\shell\MSYS2" /t REG_SZ /d "Open in MSYS2" /f
reg add "HKEY_CLASSES_ROOT\Directory\shell\MSYS2" /v "Icon" /t REG_SZ /d "C:\msys64\mingw64.ico" /f
reg add "HKEY_CLASSES_ROOT\Directory\shell\MSYS2\command" /v "" /t REG_EXPAND_SZ /d "\"C:\Windows\MSYS.bat\" \"%V\"" /f
# 桌面打开
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2" /t REG_SZ /d "Open in MSYS2" /f
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2" /v "Icon" /t REG_SZ /d "C:\msys64\mingw64.ico" /f
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2\command" /v "" /t REG_EXPAND_SZ /d "\"C:\Windows\MSYS.bat\" \"%V\"" /f
# 驱动器打开
reg add "HKEY_CLASSES_ROOT\Drive\shell\MSYS2" /t REG_SZ /d "Open in MSYS2" /f
reg add "HKEY_CLASSES_ROOT\Drive\shell\MSYS2" /v "Icon" /t REG_SZ /d "C:\msys64\mingw64.ico" /f
reg add "HKEY_CLASSES_ROOT\Drive\shell\MSYS2\command" /v "" /t REG_EXPAND_SZ /d "\"C:\Windows\MSYS.bat\" \"%V\"" /f
  • 移除
reg delete "HKEY_CLASSES_ROOT\*\shell\MSYS2" /f
reg delete "HKEY_CLASSES_ROOT\Directory\shell\MSYS2" /f
reg delete "HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2" /f
reg delete "HKEY_CLASSES_ROOT\Drive\shell\MSYS2" /f

设置环境变量

为了让一些三方软件可以引用 MSYS2 的程序,需要设置一下环境变量。在环境变量选项卡中对 Path 增加 C:\msys64\mingw64\bin\C:\msys64\usr\bin\ 目录。

同时,为了能在 MSYS2 中调用 Windows 的程序,还需要增加设置 MSYS2_PATH_TYPEinherit,这样 MSYS2PATH 会继承 Windows 环境的值。

奇奇怪怪的入口

安装 MSYS2 之后,存在一堆入口快捷方式:

.
├── MSYS2 CLANG64.lnk
├── MSYS2 CLANGARM64.lnk
├── MSYS2 MINGW32.lnk
├── MSYS2 MINGW64.lnk
├── MSYS2 MSYS.lnk
└── MSYS2 UCRT64.lnk

每一个点进去都是一个终端,看起来一样又好像不一样。

  • MSYS:
    这是 MSYS2 的一个子系统,提供了一个模拟 POSIX 环境的壳(shell),使得可以在 Windows 上运行许多 Unix/Linux 命令行工具。
    使用的是 Mingw-w64 工具链,但它为更好的兼容性使用了一组特殊的库来模拟 Unix ABI,因此在这个环境下编译的应用程序并不是真正的原生 Windows 应用。
  • UCRT64:
    UCRT64MSYS2 最新引入的一个子系统,它基于 Universal CRT (Universal C Runtime),并采用最新的 mingw-w64 工具链进行构建。
    它旨在提供更现代、更接近 Windows NT 内核 API 的原生体验,并支持更多现代 C++ 特性及标准库。
    在此环境中编译出的应用程序是原生的 64位 Windows 应用程序,但同时仍保留了对 POSIX 功能的支持。
  • MINGW32 和 MINGW64:
    这两个也是 MSYS2 的子系统,它们的目标是编译生成完全原生的 Windows 32位64位 应用程序。
    MinGW-w64 工具链在这些子系统中直接针对 Windows API 进行编译,从而产生不依赖于任何模拟层的可执行文件。
    对于开发人员来说,如果目标是在 Windows 上创建高性能且无需 Unix 兼容性的应用,通常会选择 MINGW32MINGW64 环境。
  • CLANGARM64:
    这通常指的是 MSYS2 中的一个子系统,用于支持使用 Clang (LLVM项目的一部分)作为编译器,针对的是 ARM64 架构(即 AArch64),适用于在 ARM64 架构的 Windows 设备上开发和编译软件。
  • CLANG64:
    同样是 MSYS2 中使用 Clang 作为编译器的子系统,但这里是针对 x86_64 架构(即 AMD64/Intel64)。在这个子系统下,你可以用 Clang 编译器而不是 GCC 来编译原生的 64位 Windows 应用程序。

包管理器使用

1. 安装软件包
   pacman -S package_name:安装指定的软件包。
   pacman -Sy:自动更新系统并安装所有可升级的软件包。
   pacman -Syu:自动更新系统、升级所有可升级的软件包以及安装新添加的软件源中的软件包。

2. 删除软件包
   pacman -R package_name:删除指定的软件包及其配置文件。
   pacman -Rn package_name:仅删除指定的软件包,保留配置文件。
   pacman -Rsc:删除系统中不再需要的所有软件包及其配置文件。

3. 搜索软件包
   pacman -Qs package_name:搜索系统中是否安装了指定的软件包。
   pacman -Ql package_name:列出系统中已安装的指定软件包的详细信息。

4. 查询软件包信息
   pacman -Si package_name:显示指定软件包的详细信息,包括版本号、依赖关系等。
   pacman -Fl package_name:显示指定软件包的文件列表。

5. 清理缓存和下载的软件包
   pacman -Sc:清理Pacman缓存,即清除本地数据库中的无效或过期的软件包信息。
   pacman -U download_directory/*.pkg.tar.xz:从指定的目录中安装下载的软件包。

6. 查看系统信息
   pacman -Q:显示系统中已安装的所有软件包及其状态。
   pacman -Qe:显示系统中可用的所有扩展和内核模块。
   pacman -Qi:显示系统中所有已安装的软件包的详细信息。

7. 其他常用命令
   pacman -H:显示帮助信息,列出所有可用的Pacman命令及其用法。
   pacman -T:检查系统中是否有未满足的软件包依赖关系。
   pacman -Sdd:删除系统中所有不再需要的软件包及其配置文件,同时进行磁盘空间清理。