type
status
date
Mar 18, 2024 03:19 AM
slug
summary
tags
category
icon
password
引言(问题现象对标题的补充):
用cygwin64 下gcc build
fopen_s
函数报错 `cygwin undefined reference to "`fopen_s'”
`后面发现用微软建议的 MSYS2 顺利解决.
对比gcc 版本发现差了两个大版本.maybe是这个原因导致的?
配置MSYS2
安装软件
pacman -S
安装make组件:
pacman -S mingw-w64-x86_64-make
安装cmake组件
pacman -S mingw-w64-x86_64-cmake
在vscode 终端中配置如下code后, 顺便设置为default.
vscode 中.vscode 三文件配置
msys2 安装gcc, 用pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
和 pacman -S gcc` 有什么差异
MSYS2 是一个独立的 Unix 风格的环境和命令行界面,为 Windows 提供了一个包管理系统(pacman)和构建环境。在 MSYS2 中安装 GCC(GNU Compiler Collection)有多种方式,主要取决于你想要使用的目标环境和工具链。你提到的两个命令有以下区别:
- 使用命令
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
: base-devel
:这是一组基础的开发工具,包括 make、autoconf、automake 等,这些都是编译大多数源代码所必需的。mingw-w64-ucrt-x86_64-toolchain
:这个包组包括了 MinGW-w64 项目为 x86_64 架构提供的工具链,使用 UCRT(Universal C Runtime)作为 C 运行时。工具链包括 GCC、GDB、binutils 等。
这条命令会安装一套完整的开发环境,包括 GCC 和其他编译和构建软件项目所需的工具。这个命令更倾向于为特定的架构(x86_64)和 C 运行时(UCRT)安装一个专门的工具链。
- 使用命令
pacman -S gcc
: - 这个命令会安装 MSYS2 的 GCC 包。这通常是为了在 MSYS2 的环境下编译软件,而不特定于任何 Windows 架构。
- 这里安装的 GCC 版本是为了在 MSYS2 环境下使用,主要用于编译那些需要 MSYS2 环境的项目,而不是直接为 Windows 应用编译代码。
总结:
- 如果你的目的是为 Windows 应用开发,特别是希望生成兼容 Windows 的二进制文件(无论是 32 位还是 64 位),使用
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
命令更为合适。这为你提供了一个完整的、针对 Windows 应用开发的工具链。
- 如果你只是需要一个 GCC 编译器来编译一些需要在 MSYS2 环境下运行的程序,那么使用
pacman -S gcc
就足够了。这通常用于开发或测试那些依赖于 MSYS2 特定环境的项目。
当你通过不同的命令在 MSYS2 中安装 GCC 时,可能会获得不同版本的 GCC,主要原因在于 MSYS2 包管理系统将 GCC 编译器分为了几个不同的环境和目标平台。具体来说,MSYS2 提供了三个主要的子系统:
- MSYS2:这是一个提供类 Unix 环境的子系统,主要用于提供那些需要 POSIX 兼容性的工具和库。当你仅仅安装
gcc
包时,你安装的是 MSYS2 子系统下的 GCC 版本,这个版本的 GCC 主要用于编译那些需要 MSYS2 POSIX 兼容层的程序。
- MinGW-w64:这个子系统提供了为 Windows 应用编译代码的工具链,包括 GCC。它有两个变种:一个是针对 32 位 Windows 的
mingw-w64-i686
,另一个是针对 64 位 Windows 的mingw-w64-x86_64
。通过安装mingw-w64-x86_64-gcc
(作为mingw-w64-ucrt-x86_64-toolchain
包组的一部分),你实际上安装的是为 Windows 64 位平台优化的 GCC 版本。
为什么版本不同?
- 不同的目标:MSYS2 的 GCC 与 MinGW-w64 的 GCC 针对的编译目标不同。MSYS2 的 GCC 版本主要用于编译需要 MSYS2 环境的程序,而 MinGW-w64 的 GCC 版本则专注于为 Windows 应用生成可执行文件。
- 独立更新和维护:这些 GCC 版本由不同的团队在 MSYS2 项目中独立更新和维护。这意味着更新可能会在不同的时间发布,导致可用的 GCC 版本之间存在差异。
- 不同的构建配置和选项:为了适应它们的目标环境,这两个版本的 GCC 可能会使用不同的构建配置和编译选项。这也可能影响到它们支持的功能和默认的行为方式。
因此,根据你选择的安装命令和目标平台,MSYS2 中的 GCC 版本可能会有所不同。选择哪一个取决于你的具体需求,比如你是需要为 Windows 应用编译代码,还是需要在 MSYS2 环境下工作。
mingw-w64-x86_64-gcc
和 gcc
在 MSYS2 环境中指代两种不同的 GCC 编译器,它们的主要区别在于目标平台和用途:mingw-w64-x86_64-gcc
- 目标平台:
mingw-w64-x86_64-gcc
是为了在 Windows 系统上编译原生 Windows 应用而设计的。它是 MinGW-w64 项目的一部分,目标是生成与 Windows x86_64 (64位) 架构兼容的可执行文件和库。
- 用途:使用这个版本的 GCC,开发者可以编译出不依赖于 MSYS2 环境的 Windows 应用程序。这意味着编译出的应用可以在没有安装 MSYS2 的任何 Windows 系统上运行。
- C 库:它使用 Microsoft 的 C 运行时库 (CRT) 和 Windows API,而不是 POSIX 风格的库。这使得使用
mingw-w64-x86_64-gcc
编译的程序可以直接利用 Windows 的本地接口和服务。
- 安装:在 MSYS2 中通过
pacman -S mingw-w64-x86_64-gcc
命令安装。
gcc
- 目标平台:当仅提到
gcc
时,通常指的是安装在 MSYS2 的 POSIX 兼容层上的 GCC 版本。这个版本的 GCC 主要用于编译需要 MSYS2 环境(即 POSIX 兼容性)的程序。
- 用途:这个版本的 GCC 适用于开发那些依赖于 POSIX 标准的程序,通常是为了在 MSYS2 环境下工作或者交叉编译为其他 Unix-like 系统。
- C 库:它依赖于 MSYS2 提供的库,这些库实现了许多 POSIX API,因此使用这个版本的 GCC 编译的程序需要在 MSYS2 环境中运行。
- 安装:在 MSYS2 中通过
pacman -S gcc
命令安装。
总结:
mingw-w64-x86_64-gcc
主要用于编译原生 Windows 应用程序,无需 MSYS2 环境即可在 Windows 上运行。
gcc
(在 MSYS2 环境中)主要用于编译依赖于 POSIX 接口的应用程序,适用于需要 MSYS2 环境的场景或者开发 Unix-like 系统的软件。
选择哪个版本的 GCC 取决于你的具体需求和目标平台。