0. 为什么要使用 Linux 环境下的工具链进行编程
习惯使用 Linux 进行编程之后,我最喜欢 Linux 的几个特点就是
-
对编程语言完整的工具链
GNU 工具链,Python包管理器,各种各样的工具,提供对C/C++、Python、Bash等语言极度友好的支持。
各种工具链基本上能做到对语言标准的及时支持。 相关的库都基本上可以做到一条命令安装下载。
-
脚本与自动化
基本上所有的操作,都可以编写脚本进行自动化。如果你有一些经常需要做的重复任务,脚本是提高效率唯一的选择。
-
软件包的自动升级
主流的Linux版本均有各自的包管理器(pacman,apt/apt-get),简单的命令即可对系统软件进行升级。有些编程语言,比如Python也有自己的包管理器。
一旦习惯了Linux下的编程环境(这里特指编程环境),那基本上就回不去了。尽管VS、CLion等IDE提供的开发环境是卓越的,但在熟练Linux下的开发之后,Linux独特的软件协作开发模式依然具有巨大的吸引力。
即使到了 Windows 和 Mac 上,程序员们也整出了不少方案来模拟Linux的编程环境,比如虚拟机/HomeBrew等等。如果你想在Window下获得类似Linux的编程体验,基本上有以下选择
- WSL1/2 虚拟机
- Virtualbox/Vmware虚拟机
- Windows 下原生的 Linux 软件
- Python3 for Windows:提供python程序包
- Git for Windows:除了提供git,还提供ls,grep、find等必要的软件
如果本机上可以使用虚拟机,且性能足够,那么WSL和VBox、VM虚拟机方案其实差不多。其使用也与Linux真机没有区别,这就不多说了。
对于Python和Git,我们不仅要手动下载,而且Python只能保证Python脚本的操作是一致的。 Git则可以实现一些简单的Linux操作。但两者也是只在自己的需求范围内增加了一下常用的Linux 系统命令而已,不太够用。
但是如果
- 本机性能不足,或者本机禁止使用虚拟机(公司电脑禁止开始虚拟化)
- 本机只能使用Windows系统进行编程,但是代码最好能够多平台运行,且最小改动。
- 需要在windos下进行一系列的重复性操作,且需要多个软件进行协作、比如下载、解压、处理、分析、绘图这一整套的流程。
- 省掉配置虚拟机的麻烦,直接配置编程环境
那么, MSYS2 是唯一的选择。尽管有一些不足,MSYS2事实上是跨平台程度最高,Linux编程体验最好的通用编程平台。
1. MSYS2 简介
Cygwin是Windows下最早的类Linux环境,目标是使Windows兼容大部分的Linux程序,且不需要修改源码。但其编译的程序并非原生,Cygwin的程序安装体积巨大,某些程序运行效率较低。
MinGW 则从Cygwin(1.3.3版)基础上发展而来,主要针对32 位WIndows应用开发,但不能很好的支持较新的Windows API。MinGW-W64则是新一代的MinGW,支持更多的API,支持64位应用开发,甚至支持32位host编译64位应用以及反过来的”交叉”编译。
MSYS 则专注于辅助Windows版MinGW进行命令行开发的配套软件包。但是MinGW 和MSYS的更新太慢,因此Cygwin的许多新功能MSYS没有同步过来。
MSYS2(Minimal SYStem 2)是一个基于MSYS的独立改写版本, 准确的说是集成了pacman和Mingw-w64的Cygwin升级版,提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64工具链。
MSYS2 主要优点如下
- MSYS2提供了大量开发组件,包括GCC,Mingw-w64,CPython,CMake,OpenSSL, FFmpeg, Rust, Ruby等等,是完整的开发环境。
- MSYS2 专注于开发环境的配置,软件体积更小。
- 提供原生的Windows 32/64位支持,程序运行速度更快
- MSYS2 使用Pacman作为包管理器,在 Windows 下方便地进行软件包的更新,且更新较为频繁。
2. MSYS2 环境选择
MSYS2 拥有以下几种开发环境。主要是不同的工具链和库的组合。
Name | Prefix | Toolchain | Architecture | C Library | C++ Library | |
---|---|---|---|---|---|---|
![]() |
MSYS | /usr |
gcc | x86_64 | cygwin | libstdc++ |
![]() |
UCRT64 | /ucrt64 |
gcc | x86_64 | ucrt | libstdc++ |
![]() |
CLANG64 | /clang64 |
llvm | x86_64 | ucrt | libc++ |
![]() |
CLANGARM64 | /clangarm64 |
llvm | aarch64 | ucrt | libc++ |
![]() |
MINGW64 | /mingw64 |
gcc | x86_64 | msvcrt | libstdc++ |
由于我的需求是跨平台开发,且需要交叉编译。因此选择 UCRT64 环境。
3. 使用 UCRT
UCRT 是微软在 Windows10 以后主推的新版Windows环境的 C 运行时库,仅提供64位版本。好处是该环境下编译的程序,可以直接在Window10/11上直接运行,不需要任何附加dll。程序再也不依赖万恶的 msvcrt.dll了。
安装 UCRT 编译工具链
pacman -S mingw-w64-ucrt-x86_64-toolchain
相比MSVC,UCRT能够提供更好的C语言标准支持。结合gcc,MSYS2的编程环境及编译输出基本上与Linux相同。最大程度实现了一处编写,处处运行。
4. 主要设置
MSYS2 下载
首先,下载MSYS2 的安装包进行安装。 Index of msys2distribx86_64 清华大学开源软件镜像站 Tsinghua Open Source Mirror
一般默认安装位置为C:\msys64
,最好不要装在别的目录中,更不能装在中文名称的目录中。
安装路径要求:要求卷类型为NTFS,路径只有ascii字符,没有重音,没有空格,没有符号链接,没有subst或网络驱动器,不能是FAT。
MSYS2 添加国内源
默认的源速度其实挺快的。但如果你所在的网络环境使得默认源的下载速度较慢,则可以手动修改源的地址。
msys2 镜像站使用帮助 清华大学开源软件镜像站 Tsinghua Open Source Mirror
将pacman 的默认源修改成清华大学开源镜像网站。
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
或者直接使用Vscode或者记事本修改对应的mirrorlist
C:\msys64\etc\pacman.d\mirrorlist.ucrt64
MSYS2 安装相关软件
我主要使用三种软件
- gcc工具链,make 、cmake等等
- python及其软件包,pandas、numpy、
- Linux 系统指令软件,如ls、mkdir等等
MSYS2 几乎囊括了这三种软件。
pacman -S mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-extra-cmake-modules mingw-w64-ucrt-x86_64-make mingw-w64-ucrt-x86_64-gdb mingw-w64-ucrt-x86_64-toolchain
对于python,我没有在 MSYS2 中使用pyev。直接使用官方源中提供的包。
pacman -S mingw-w64-ucrt-x86_64-python-pandas mingw-w64-ucrt-x86_64-python-numpy mingw-w64-ucrt-x86_64-python-matplotlib
安装完成之后,既可以使用 MSYS2 中的Vim直接进行开发工作,也可以安装Vscode,并调整设置使其使用MSYS2中的gcc、git、python作为开发后端。
pacman 的主要操作命令如下,最经常使用的就是pacman -Syu
和pacman -Ss
命令 | 描述 |
---|---|
pacman -S <package_name> |
从官方软件仓库安装软件包 |
pacman -Ss <search_term> |
在软件仓库中搜索软件包 |
pacman -R <package_name> |
从系统中移除软件包 |
pacman -Syu |
升级所有已安装的软件包 |
pacman -Qe |
列出已显式安装的软件包 |
pacman -Sc |
清理软件包缓存 |
5. 重点推荐
- git windows版的git其实就是从MSYS中裁剪出来的。MSYS2中的git可以便利升级,基本上可以做到与官网同步。
- tmux 在mintty享受更加接近Linux的开发体验,多个窗口无缝切换
- parallel 既然要在Windows下运行脚本,必然要配合parallel,将现代CPU的多核优势发挥到极致。
- ncdu 快速查看指定目录下的文件夹体积占用情况。
6. 缺陷与不足
- 由于 Windows系统本身的限制,sh/py 脚本无法直接运行,必须指定shell或者python版本,比如
sh run.sh
- 无法更改正在运行或者被其他程序独占的文件
- 没有top、htop等
- 软件数量总体偏少,几乎没有GUI程序。但这个缺点可以用 PortableApps 补足。