MinGW-w64 和 MSYS2 笔记
贡献者: addis
1. 不同工具的比较
- MSYS 和 WSL,Cygwin 等的对比
- 无论是 MinGW 还是 MSYS,二进制可执行文件都是 Windows 原生的 exe/dll 等文件。MinGW 工具链可以使用
Windows.h
调用 Windows API,在 Linux 上无法运行。
- WSL1/2 的可执行文件都是 Linux 的 ELF 文件,可以直接在 Linux 系统上运行,调用 Unix API(WSL1 相当于 Linux 和 Windows 之间的二进制兼容层,WSL2 是彻底的虚拟机),不能直接在 Windows 运行。
- 所以选用哪个取决于你开发出来的软件最终要在 Windows 系统还是 Linux 系统或 WSL 上跑。
-
MinGW
加 MSYS
相当于一个轻量级的 Cygwin
,后者编译的软件需要链接到 cygwin1.dll
,它可以把对 Unix API 的调用转换成对 Windows API 的调用(但应该不在二进制层面)。
POSIX API 是什么?
- 文件系统: Functions for creating, reading, writing, and closing files, as well as manipulating directories.
- 进程管理: Capabilities for process creation, execution, and synchronization, including fork, exec, and various forms of inter-process communication (IPC) like pipes and message queues.
- 线程管理: Standards for multithreading support, including thread creation, synchronization primitives like mutexes, and condition variables.
- 网络接口: APIs for socket-based communication, allowing for the implementation of client-server models and network communication.
- System Calls: Standardized system calls for resource management, including memory allocation and device control.
2. MinGW (Minimalist GNU for Windows)
- MinGW 只是在 Windows 上提供 GCC 和 GDB 等工具,不包括 bash shell,
cat, echo
等命令。MSYS 提供 bash shell 和 cat, echo
等命令但本身不提供编译器。所以二者通常一起使用。建议直接安装 MSYS,然后用 pacman 安装 MinGW 的 gcc 编译器等。
- MinGW 仅支持 32-bit 程序,现在一般用 MinGW-w64,既支持 32 也支持 64-bit
- 一个教程。
- MSYS2 是一个 windows 上的 bash shell 调用 MinGW-W64 来实现编译。MSYS 最早是 Cygwin 的一个分支。
- 双击
mingw64.exe
即可打开 mingw 命令行。mingw64.exe
所在的目录就是命令行的根目录。
- 可以检查
g++
的版本。
- 用
g++
编译程序以后,会出现 a.exe
而不是 a.out
。这个执行文件是可以双击执行的,但是运行完会马上退出。可以在程序最后用 getchar()
。也可以打开一个 cmd 命令行然后运行 a.exe
。当然在 mingw64
的命令行也可以执行。另外执行时 .exe
拓展名可以省略。
- mingw 不能使用
apt
或类似的包管理软件,一切库都要自己手动编译。或者用 MinGW instellation 安装 32-bit 版本。MSYS 上可以用 pacman
。
-
MinGW instellation manager
是一个 GUI 界面,可以下载安装编译好的 mingw 程序。例如安装 mingw32-make
,安装以后就和 make
的用法一样。注意该 manager 并不是一个通用的包管理软件,里面的包基本还是围绕 GCC 的。
-
c
盘的目录为 /c
- 如果创建 symlink 会直接复制文件(夹)而不是真的 link。
-
explorer 路径
可以在 路径
打开文件浏览器
-
code 文件或路径
可以用 VScode 打开
-
start 文件或路径
可以用默认软件打开(包括浏览器和 code 等)
-
g++
中定义的宏有 __GNUC__
,__MINGW32__
,__MINGW64__
- 编译动态链接库的方法和 linux 中一样,同样支持用
ldd
查看动态程序的库依赖(dll
和 so
拓展名都会搜索到,但建议用 dll
,让其他 windows 程序也可以使用)。
- MinGW 中(也就是 Windows 中),
LD_LIBRARY_PATH
变量是没用的,直接添加到 PATH
就可以在其中的路径下自动搜索 dll
3. MSYS2
- 官网
- MSYS2 使用
pacman
进行包管理,和 Arch linux 一样。
- 安装后无需另外安装 MinGW,直接用 pacman 就可以安装 mingw 版的 g++ 等编译工具。
- 所有可用的包在这里查找。名字一般和
apt
命令中的不一样。
- 这个页面里面有 4 种 Repository:Clang、UCRT、MinGW、MSYS(例如 gcc 编译器有这些不同 repo 的版本)我们稍后讨论。现在可以先安装 MinGW 版本的。
- 根目录在
C:\msys64\
,和 mingw 一样可以用 /c
访问 C 盘。
- 安装 gcc:
pacman -S mingw-w64-x86_64-gcc
(UCRT 版的是 mingw-w64-ucrt-x86_64-gcc
,MSYS 版的是 gcc
)。
- 安装目录是
/mingw64/bin
,要把它默认添加到 PATH,用 echo 'export PATH=$PATH:/mingw64/bin' >> ~/.bashrc; source ~/.bashrc
- 现在应该就可以
g++ --version
查看版本,愉快编译程序了。
- 用
g++
编译时,宏 __MSYS__
有定义,而 __MINGW32__
和 __MINGW64__
没定义。
- (看起来好像用处不大可以先不装)
pacman -S base-devel
包含 binutils bison diffstat diffutils dos2unix flex m4 make patch pkgconf texinfo texinfo-tex base-devel
- 现在可以写一个简单的 c++ 程序并编译,默认可执行文件是
a.exe
。直接在 MSYS2 中运行没问题,但是如果在 Windows 中双击就会找不到 dll。
- 这时可以在 MSYS2 中用
ldd a.exe
看看需要什么动态库。其中 /c/WINDOWS/SYSTEM32
类似的目录不需要管,因为它们已经在 PATH 中且是 Windows 系统提供的。
- 如果你装的是 UCRT 版本的 gcc,那额外 dll 将会在
/ucrt64/bin/
中(也就是 C:\msys64\ucrt64\bin\
中)。UCRT 是 Windows 的 Unified C Runtime。
- 如果你装的是 MinGW 非 UCRT 版本的 gcc,那额外依赖的 dll 是
/mingw64/bin/
中的 libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll
- 解决 Windows 找不到 dll 的一个简单的方法就是把额外需要的依赖库文件直接拷贝到和 exe 同一个目录中。
- 如果
.dll
文件的目录中有同名的 .dll.a
文件,那么编译器会链接后者的符号
- 双击 exe 成功运行后,窗口会迅速闪退,在
main()
函数退出前用一个 getchar();
即可实现任意键退出。
- 是否可以在编译时使用 rpath 把依赖库的相对目录直接写进 exe 中(这样就可以把库放到子文件夹)?GPT 说这是不行的。要么修改系统路径,要么创建一个 XML 文件指定依赖路径,命名为
可执行文件名.exe.manifest
,和 exe 文件放在一起即可(详见)。
- 如果程序中使用了
system()
,那么当它在 MSYS2 命令行中运行时可以调用 Unix 命令例如 mkdir
,但双击运行时调用的应该是 cmd
。
MSYS 的 Clang、UCRT、MinGW、MSYS 仓库
- MinGW 仓库是最经典最成熟历史最久的仓库,编译出的 exe 只依赖于 Windows 提供的 dll
- Clang 类似于 MinGW 但用的不是 gcc 编译器而是 clang
- UCRT 仓库更现代兼容更多新的 Windows API,例如 Windows 10 或以上的,但生成的 exe 依赖于额外的 ucrt dll。
- MSYS 版本编译出的 exe 运行时依赖于 Unix 兼容层 dll,不能直接发布。Windows 原生软件,通途有点类似于 WSL。
4. MinTTY
- MinTTY 是 MinGW 和 MSYS2 默认的命令行窗口,Git Bash 用的也是这个。
-
Ctrl+Ins
复制,Shift+Ins
粘贴。
-
Ctrl+=
放大 Ctrl+-
缩小。滚轮也可以。
-
Alt+F3
搜索
致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者
热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。