MSYS2 简介
简单的说,MSYS2 是 MSYS 的一个升级版, 提供了 GCC 工具链。与 MSYS 最大的区别是移植了 Arch Linux 的软件包管理系统 Pacman。有了 Pacman 升级系统,安装新软件包,还有解决软件包间的依赖问题就变得简单多了。从 http://msys2.github.io/ 下载安装包并安装,安装包的文件名通常为 msys2-<架构>-<日期>.exe ,根据 CPU 架构选择最新的安装包。
MSYS2 设计目标是在 MS Windows 上运行 MinGW 工具链的,它有两套 MinGW 工具链,一个是 mingw32,一个是 mingw64。它们的功能是一样的,都是用于编译 MS Windows 上的代码(能调用 MS Windows 应用程序接口,不能调用 Unix/Linux 系统调用)的,可以生成“纯净”的 win32 和 win64 可执行文件。这些可执行文件运行时只依赖 MS Windows 系统的动态库或静态库。另外,MSYS2 自身还带了一个原生 GCC 工具链,它可用于编译 UNIX/Linux 代码,但支持的函数仅限于 POSIX 部分,其他系统调用都不支持,如 Linux 的 epoll、eventfd 等等,所以功能有限。原生 GCC 工具链可编译生成 MS Windows 平台上的可执行文件,但它们的运行必须依赖 msys2xxx.dll。开发专业应用软件,不要使用 MSYS2 的原生 GCC 工具链,它只是为了编译 MinGW 工具链而存在的,是制造工具的工具。
可以看到 MSYS2 有三个执行脚本,分别是 msys2_shell.bat、mingw32_shell.bat 和 mingw64_shell.bat,查看相应的文件内容可以看到其中的区别。实际上,三个 .bat 的区别就是对环境变量 PATH 的不同设置,mingw32_shell.bat 优先使用 msys64/mingw32 下的工具,mingw64_shell.bat 优先使用 msys64/mingw64 下的工具,而 msys2_shell.bat 两个都不使用,只用自身 msys 的工具(依赖 msys2xxx.dll)。这么做的好处是当需要编译 32 位的项目时使用 mingw32_shell.bat,64 位的项目使用 mingw64_shell.bat,各套工具互不干扰。
配置软件源
需要修改安装目录下,/etc/pacman.d 文件夹中的 mirrorlist.msys、mirrorlist.mingw64、mirrorlist.mingw32 三个文件,分别在文件开始处添加
> notepad /etc/pacman.d/mirrorlist.msys: ##中国科学技术大学开源软件镜像 Server = http://mirrors.ustc.edu.cn/msys2/MSYS2/$arch ##北京理工大学镜像 Server = http://mirror.bit.edu.cn/msys2/REPOS/MSYS2/$arch ##清华大学开源镜像 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch > notepad /etc/pacman.d/mirrorlist.mingw64: ##中国科学技术大学开源软件镜像 Server = http://mirrors.ustc.edu.cn/msys2/MINGW/x86_64 ##北京理工大学镜像 Server = http://mirror.bit.edu.cn/msys2/REPOS/MINGW/x86_64 ##清华大学开源镜像 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64 > notepad /etc/pacman.d/mirrorlist.mingw32: ##中国科学技术大学开源软件镜像 Server = http://mirrors.ustc.edu.cn/msys2/MINGW/i686 ##北京理工大学镜像 Server = http://mirror.bit.edu.cn/msys2/REPOS/MINGW/i686 ##清华大学开源镜像 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
提高数据库访问速度
Pacman 将所有软件包的信息放在一一对应的许多小文件中。通过改善数据库访问速度,可以减少花在数据库相关任务上的时间,比如:寻找软件包、检索软件包依赖性。最安全最简单的方法是以root身份运行
$ pacman-optimize
上述命令试图将所有小文件放在磁盘上同一个物理区域,以减少磁头移动。这种方法很安全,但不一定有效。其效果取决于你的文件系统、磁盘使用率、和磁盘碎片程度。另一种更激进的方式是在优化数据库之前首先删除 cache 中所有未安装以及不使用的仓库中的包:
$ pacman -Sc && pacman-optimize
加快下载速度
如果你的包下载速度变得极慢,首先确定你用的是那些(镜像)网站而不是 MSYS2 的官方链接。其次,可以通过各种下载工具而不是 Pacman 内置的下载方式,来改善 Pacman 的下载速度。不论怎样,在做任何修改前,你必须确定拥有了最新版的Pacman:
$ pacman -Syu
对于需要更强大代理支持的用户来说,用 wget 比用 Pacman 自己的下载方式更加方便。要使用 wget,首先使用
$ pacman -S wget
安装它,然后修改 /etc/pacman.conf 并在其中的 [options] 区段将下面内容去掉注释:
$ nano -w /etc/pacman.conf XferCommand = /usr/bin/wget -c --passive-ftp -c %u
除了将 wget 参数放在 /etc/pacman.conf 里,你也可以直接修改 wget 配置文件(全局文件是/etc/wgetrc,各个用户的文件是 $HOME/.wgetrc)。 如果对于支持断点续传的下载工具还不满足需求,那么可以使用支持多线程的断点下载工具。例如 aria2 是一个具有断点续传和分块下载功能的轻量级下载软件,支持 HTTP/HTTPS/FTP 协议。aria2 可以以多线程的方式通过 HTTP/HTTPS和FTP 协议连接镜像服务器,显著提高下载速度。先使用下述方式
$ pacman -S aria2
安装 aria2。接着修改 /etc/pacman.conf,在 [option] 段添加下列一行(如果已存在则修改之):
$ notepad /etc/pacman.conf XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 -t5 -d / -o %o %u
开启 pacman 的多线程下载之旅吧!
安装必要的工具链和必要的开发库
下面假设使用的是 64 位系统。如果使用的是 32 位系统,仅需后面出现的 x86_64 改为 i686。在 MS Windows 开始菜单中运行 mingw64_shell.bat 以打开命令行窗口。更新本地软件包数据库也即与软件仓库同步:
$ pacman -S --refresh
或
$ pacman -Sy
然后升级软件包也即更新系统:
$ pacman -S --sysupgrade
或
$ pacman -Su
通常,将上述命令合二为一
$ pacman -Syu
现在开始安装工具链
$ pacman -S mingw-w64-x86_64-toolchain
如果提示冲突,则使用
$ pacman -S --force mingw-w64-x86_64-toolchain
开发的各种辅助工具
$ pacman -S base-devel
安装 GTK+-3 的库
$ pacman -S --force mingw-w64-x86_64-gtk3
安装 GTK+ 快速构建工具 Glade 包
$ pacman -S --force mingw-w64-x86_64-glade3
安装 wxWidgets 的库
$ pacman -S --force mingw-w64-x86_64-wxWidgets
安装 OpenGL 库(虽然微软操作系统自带了 OpenGL 库,为了与 MSYS2 相容,选用 GLEW、FreeGLUT 库)
$ pacman -S --force mingw-w64-x86_64-glew mingw-w64-x86_64-freeglut
pacman 的常用用法
查看 pacman 工具帮助
$ pacman -h $ pacman -S -h
列出本地 pacman 软件包数据库中的软件包清单
$ Pacman -Sl
列出所有已安装的软件包
$ pacman -Q --explicit
或者
$ pacman -Q -e
或直接
$ pacman -Q
安装新的软件包或软件组
$ pacman -S
比如我要安装 gcc,那么执行:
$ pacman -S gcc
很多时候,我们不知道要安装软件的准确名称,这时就要先查询软件包的名称。
$ pacman -Ss
比如我想安装 gcc 相关的软件,那么可以这样搜索
$ pacman -Ss gcc
可以列出所有的软件组
$ pacman -Q --groups
或者
$ pacman -Q -g
查看软件组
$ pacman -S -g
查看软件组包含的软件
$ pacman -Q -g
例如
$ pacman -Q -g base-devel
查询软件包的内容
$ pacman -Q -l
例如查询软件包 gtk+ 的内容
$ pacman -Q -l gtk+
查询软件所在的软件包或软件组
$ pacman -Q -s
例如
$ pacman -Q -s nettle
强制安装某个包(不管是否已安装)
$ pacman -Sf nettle
更新系统但不升级某个包
$ pacman -Su --ignore mysql
删除一个软件包
$ pacman -R
例如删掉某个包但忽略无用依赖的删除
$ pacman -R glade3
删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
$ pacman -Rs mysql
清理当前未被安装软件包的缓存(/var/cache/pacman/pkg):
$ pacman -Sc
清理所有下载的包与数据库
$ pacman -Scc
下载包而不安装它
$ pacman -Sw mysql