WinLibs
WinLibs是mingw在Windows平台的分发库
WinLibs专注于Windows下的GCC。优点是发布比较及时,发行版本丰富多样。免安装,多版本可以共存。
下载链接:
https://winlibs.com/
GitHub:
https://github.com/brechtsanders/winlibs_mingw/releases
WinLibs的设计理念
Winlibs的目标是成为微软Windows开发人员的开发生态系统,通过秉承一套设计决策来解决许多问题。
目标Windows
winlibs.com的目标是提供一系列针对原生 Microsoft Windows 的工具和库,以便在Microsoft Windows上使用。
可以使用MinGW-w64在其他平台(例如Linux)上构建Windows软件——这种实践称为交叉编译。然而,这对于一个新手用户来说并不容易,特别是如果这个用户更熟悉Microsoft Windows环境,甚至可能不熟悉命令行环境。这就是为什么winlibs.com的重点完全是Windows。不需要其他操作系统的知识。如果使用IDE,也不需要命令行知识。
提高软件的可移植性
虽然主要关注Windows,但使用的大多数工具和库都来自Linux和类Unix世界。由于相同的工具是共享的(例如GNU编译器集合),因此编写运行于其他操作系统(如Linux或macOS)的软件更容易。另一方面,如果其他平台已存在的代码,移植到Windows上可能会更容易。
选择工具
编译器
在过去,有几个开源解决方案可以为Windows构建软件:
- Cygwin - 模拟 POSIX API,允许编译来自 Linux/Unix 世界的源代码。然而,这个模拟层有它的性能影响,它也意味着生成的二进制文件不是 Windows 原生的。
- MinGW - “Minimalist GNU for Windows” 的缩写,生成原生 Windows 二进制文件,但不支持更新的 Windows 特性,也不支持 Windows 64位。
- MinGW-w64 - MinGW-w64 是原始 mingw.org 项目的升级版,创建 MinGW-w64 是为了支持 Windows 系统上的 GCC 编译器。派生于2007年,为了提供对64位和新api的支持。
由 winlibs.com 提供的编译器工具主要是基于MinGW-w64并结合了GNU编译器集合,但也添加了其他构建软件,如 LLVM/Clang 和各种汇编器。
shell
由于许多开源软件最初并不打算用于Windows,因此通常需要一个类似Linux/Unix的shell来构建这些软件(例如当使用Autotools时):
- Cygwin - 附带一个Bash shell,但附带其仿真层性能开销。
- MSYS - 使用Cygwin构建的Bash shell环境,也很慢。
- MSYS2 - 重写MSYS使用Cygwin和MinGW-w64来构建,它比MSYS或Cygwin快得多。
MSYS2附带了一个包管理器,它也允许安装自己构建的MinGW-w64和GNU编译器集合,但是这些不会被使用,因为它们并不总是遵循与winlibs.com相同的原则。
线程模型
MinGW-w64可以用2种不同的多线程模型构建:
- win32 - 标准的Windows多线程功能,没有c++ 11多线程功能。
- posix - posix线程兼容实现(使libgcc依赖于libwinpthreads),包括c++ 11/C11多线程特性。
为了最大限度地提高兼容性和可移植性,选择了posix线程模型。应用程序仍然可以使用Win32 API或pthreads API。
不混合
某些东西不应该混在一起,因为它们经常导致问题:
- 32位和64位Windows的分离 — 很多人在链接他们的软件时都很纠结,因为他们有时会不小心把32位和64位的Windows库混在一起。为了避免这种混淆,两个平台是完全分开的。例如,没有提供生成32位输出的64位编译器。
- 所有库都使用相同的编译器构建 — 不会使用从其他地方以二进制形式下载的库或使用其他编译器(例如MSVC)编译的库。
- 异常处理方法不应该混合使用。可用的异常处理方法取决于平台(Windows 32位或Windows 64位)。
- DW2 (DWARF-2) — 需要使用DWARF-2(或DWARF-3)调试信息,并且可能导致可执行文件稍微膨胀,因为必须在可执行文件中包含大型调用堆栈展开表
- SJLJ (setjmp/longjmp) — 比DW2慢(在没有抛出异常的情况下,即使正常执行也会受到惩罚),但可以跨未使用GCC编译或没有调用堆栈展开信息的代码工作
- SEH(结构化异常处理) - 本地的Windows异常处理机制,在32位的Windows上GCC还不支持
- 经过广泛的辩论(见:议题 #4 和 #20),并经过慎重考虑,选择了以下异常处理方法:
- Windows 32位:DW2 (DWARF-2)
- Windows 64位:SEH(结构化异常处理)
共存
winlibs.com生态系统没有Windows安装程序,因此它不需要管理员权限来安装,也不会修改系统(例如,通过写入Windows注册表或更改PATH环境变量)。简单地提取独立包就足够开始了。你甚至可以把它放在可移动驱动器上(比如u盘)。
多个winlibs.com工具链可以存在于同一系统的不同文件夹中(例如32位和64位,甚至不同的发布版本)。
由于系统没有被修改,其他安装的构建环境不会损坏(例如MSVC)。
这使得它很容易试用。要删除,只需删除文件夹就可以。