Hol*_*Cat 16
参见官方手册。提供以下环境:UCRT64、MINGW64、CLANG64、MSYS 等(请参阅链接)。
\nUCRT64 是一个很好的默认值,MINGW64 也很流行,但替代方案如下所述。
\n存在不同的环境来生成不同类型的 Windows 可执行文件,或者使用不同的工具来生成不同类型的 Windows 可执行文件。
\n每个环境都有自己的包(编译器、预编译库和各种可执行文件),可以通过包名称中的公共前缀来区分(例如mingw-w64-ucrt-x86_64-...对于 UCRT64)。
每个环境将其文件安装到MSYS2 安装内的单独子目录C:\\msys64\\ucrt64,例如 UCRT64 安装到,等等(除了 MSYS 特别安装到C:\\msys64\\usr,以及一些软件包直接安装到C:\\msys64)。
每个环境在“开始”菜单中都有相应的快捷方式,该快捷方式启动 MSYS2 终端并将相应的目录添加到其PATH. 例如PATH 中的MSYS2 UCRT64开头。C:\\msys64\\ucrt64\\bin
默认情况下,MSYS2 忽略系统范围的PATH设置,并使用完全自定义的 启动其终端PATH,运行echo $PATH以查看它。
所有环境也添加C:\\msys64\\usr\\bin到PATHafter C:\\msys64\\<env>\\bin。因此,在某种程度上,所有环境都继承自 MSYS 环境。下面详细介绍一下。
环境还自定义了一些其他的环境变量,printenv自己运行看看。
MSYS2 终端在终端提示符中以洋红色文本显示当前环境。
\n您安装的所有软件包都必须有适当的名称前缀。例如对于 UCRT64,mingw-w64-ucrt-x86_64-...(其他环境请参见下表)。
这适用于所有编译器、库等。因此,如果您想在 UCRT64 中安装 GCC,请使用pacman -S mingw-w64-ucrt-x86_64-gcc,而不是pacman -S gcc。
唯一的例外是从 Linux 移植的与编译过程无关的实用程序,例如grep、sed、bash等,它们没有前缀包。
没有前缀的包都属于MSYS环境。
\n警告:通常您可以为多个环境安装软件包,并且它们不会相互干扰,除了无前缀的 MSYS 软件包适用于PATH所有环境,其中一些软件包会妨碍您。例如,如果您安装了pacman -S gcc,忘记安装了pacman -S ...-gcc,然后尝试从 MSYS 以外的任何环境运行gcc,您将调用 MSYS 环境的 GCC,而不是您环境的 GCC。大多数时候这不是您想要的,并且您会收到神秘的错误。
(值得注意的例外是make,它的带前缀和不带前缀的软件包使用不同的可执行文件名称,因此它们不会冲突,可以同时安装,并且都是可行的选项。带前缀的版本(安装为 )运行速度更快mingw32-make,但无前缀的路径函数通过返回 Linux 风格的路径来提供更好的 Linux 兼容性。)
如果您使用 MSYS2 终端,请使用适当的快捷方式启动终端。
\n快捷方式中包含环境名称,例如对于 UCRT64,请使用MSYS2 UCRT64快捷方式。
如果您不使用 MSYS2 终端并从其他地方调用工具,请将适当的目录添加到 PATH,例如对于 UCRT64 add C:\\msys64\\ucrt64\\bin。
在极少数情况下,您可能还需要添加C:\\msys64\\usr\\bin. 如果这样做,请确保将其添加到前面提到的目录之后。
为了避免出现问题,最好将这些目录直接放在PATH(系统范围的和特定于用户的)的开头。
对于大多数用途来说,UCRT64 应该是一个很好的默认值。
\n否则,选择取决于:
\n| 环境 | UCRT64 | 明GW64 | 铿锵64 | 系统管理系统 |
|---|---|---|---|---|
| 安装到 (通常相对于 MSYS2 安装 目录 C:\\msys64\\...) | /ucrt64 | /mingw64 | /clang64 | /usr(一些包裹到 /?) |
| 包前缀 | mingw-w64-ucrt-x86_64- | mingw-w64-x86_64- | mingw-w64-clang-x86_64- | 没有任何 |
| 目标架构 | x86_64 | x86_64 | x86_64 | 赛格温 x86_64 |
| 编译器 | GCC(也称为 Clang) | GCC(也称为 Clang) | 铛 | GCC(还有 Clang) (可能已经过时) |
| C++标准库 | libstdc++(也称为 libc++) | libstdc++(也称为 libc++) | 库++ | libstdc++ 库 |
| C标准库 | UCRT | 多中心静脉曲张放疗 | UCRT | 西格温 |
| 消毒剂 | 1号 | 1号 | 是的 | 1号 |
1 \xe2\x80\x94 UBSan 可以工作,但它无法打印诊断信息,并且只能在出错时崩溃。
\n目标架构变体:
\n32位
\n上述所有环境都会生成 x64 可执行文件(又名 x86_64)。
\n还有 x32 可执行文件(又名 i686)的环境:MINGW32和CLANG32.
它们与各自的 x64 环境类似,只不过文件安装到/...32目录而不是/...64,并且包前缀包含i686代替x86_64。
手臂
\n上述所有环境都会生成x86(x32 或 x64)的可执行文件。这是大多数台式机和笔记本电脑运行的系统。
\n显然现在有一些ARM笔记本电脑也运行 Windows。虽然他们可以模拟 x86 来运行 x86 应用程序,但本机 ARM 应用程序应该具有更好的性能。
\nCLANGARM64 环境可用于生成 ARM(又名 aarch64)应用程序。它与 CLANG64 类似,只不过文件安装到/clangarm64,并且包以mingw-w64-clang-aarch64-.
C 标准库,MSVCRT 与 UCRT:
\n手册很好地解释了其中的差异。
\n简而言之:
\nMSVCRT ( msvcrt.dll):
旧的,来自Microsoft Visual Studio 6.0。
\n直到几年前,这还是 MinGW 的唯一选择。
\n路径不支持 UTF-8,必须使用 UTF-16 并wchar_t处理路径中的 unicode。
UCRT ( ucrtbase.dll)
新颖而闪亮,这就是当代 Visual Studio 所使用的。
\n默认情况下在 Windows 10 上可用,在之前的 Windows 版本上必须手动安装。
\n如果您在应用程序中启用 UTF-8 区域设置,则支持路径中的 UTF-8。
\nMSYS环境:
\n该环境基于 MSYS2 自己的Cygwin分支分支,它是一个 POSIX 模拟层。
\n它主要用于编译不是以跨平台方式编写的 Linux 应用程序。可以说,新应用程序首先应该以跨平台方式编写,然后使用其他环境进行编译。
\nMSYS2 使用它来提供bash, grep, sed,awk和其他 Linux 上常用的命令行实用程序。
根据我有限的理解,MSYS 应用程序通常仅在 MSYS2 shell 内部用于开发目的,而不分发给用户。
\n除此之外,用它编译的应用程序会看到 Linux 风格的所有路径:以正斜杠/作为分隔符,将/(根)目录映射到 MSYS2 安装目录,并/c神奇地映射到C:\\(与其他驱动器号类似)。他们还可以访问模拟的 Linux 特定功能,例如fork().
该模拟层具有性能成本。
\n还应该注意的是,MSYS 似乎没有提供与其他环境一样多的库(和一般的包),并且不会频繁地接收编译器更新。
\n| 归档时间: |
|
| 查看次数: |
3021 次 |
| 最近记录: |