在 Windows
上编译 GUN
的 C/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-w64
是 MinGW
的升级版,MinGW
是一个 GNU
编译器链,它提供了 C
和 C++
编译器,以及一些其他工具,如 make
、gdb
等。MinGW-w64
是 MinGW
的一个分支,它提供了与 MinGW
相同的功能,但同时支持 64 位
和 32 位
的编译。
MinGW-w64
分发形式
MinGW-w64
的发行商有很多,有的提供仅包含 GUN
工具链的压缩包;有的提供的是类 Linux
的终端环境,MinGW-w64
只是其中的一个软件包的存在。
- 提供单压缩包的渠道
- 提供类
Linux
终端环境的渠道
具体可以在 https://www.mingw-w64.org/downloads/ 查看。
安装方式
单压缩包的版本部署相对简单,下载之后解压到本地,配置 Path
环境变量之后就可以使用了。
各种类 Linux
终端环境安装一般会复杂一点,安装之后一般都不会存在 GUN
工具,需要使用对应的包管理器来安装。
Cygwin
和 MSYS2
的区别
Cygwin
和 MSYS2
是 Widnows
常用的两个 Linux
模拟环境。它们都提供了 MinGW-w64
软件包支持,单两者的用途不同:
Cygwin
Cygwin
专注于按原样在Windows
上构建Unix
软件,允许在Windows
上运行原生的GNU
命令行工具。MSYS2
MSYS2
专注于构建针对Windows API
构建的本机软件。并且MSYS2
提供了pacman
包管理器,可以安装各种GNU
软件包。
交叉编译支持
MinGW-w64
不仅仅只是用在 Windows
上,在其他的操作系统中(比如 Linux
,MacOS
等),可以通过 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-completion
:Tab
佬必备。
git
:平替Windows
的Git
。
设置别名
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 windows
:C:\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_TYPE
为 inherit
,这样 MSYS2
的 PATH
会继承 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:
UCRT64
是MSYS2
最新引入的一个子系统,它基于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
兼容性的应用,通常会选择MINGW32
或MINGW64
环境。 - 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:删除系统中所有不再需要的软件包及其配置文件,同时进行磁盘空间清理。