Windows安装mingw32/w64

1.下载

MinGW-w64

WinLibs - GCC+MinGW-w64 compiler for Windows

Releases · niXman/mingw-builds-binaries (github.com)

MinGW-w64、UCRT 和 MSVCRT 是 Windows 平台上常用的 C/C++ 运行库,它们有以下不同点:

  1. MinGW-w64:是一个基于 GCC 的编译器套件,可以用于编译 Windows 平台上的 C/C++ 程序。MinGW-w64 使用的是 POSIX 标准的运行库,因此可以很好地兼容 Unix/Linux 程序。MinGW-w64 的默认运行库是 MSVCRT(Microsoft Visual C++ Runtime),但也可以使用其他运行库。
  2. UCRT(Universal CRT):是微软提供的一个通用 C 运行库,可以用于编译 Windows 平台上的 C/C++ 程序。UCRT 提供了许多与标准 C 库兼容的函数,并支持新的 C11 和 C++11 标准。UCRT 适用于 Windows 10 或更高版本的操作系统。
  3. MSVCRT(Microsoft Visual C++ Runtime):是微软提供的一个 C++ 运行库,可以用于编译 Windows 平台上的 C/C++ 程序。MSVCRT 提供了许多与标准 C 库兼容的函数,但不支持新的 C11 和 C++11 标准。MSVCRT 在 Windows 操作系统中已经内置,并且随着 Visual Studio 版本的升级而不断更新。

2.配置环境变量

将 MinGW 的 bin 目录添加到系统的 PATH 环境变量中,这样可以在命令行中直接使用 MinGW 的工具。

3.验证版本

gcc 和 g++ 都是 GNU 工具链中的编译器,它们的主要区别在于它们所编译的代码的语言不同。

gcc 是 GNU C 编译器,它主要用于编译 C 语言程序,可以将 C 语言源代码编译成可执行文件或动态链接库。

g++ 则是 GNU C++ 编译器,它主要用于编译 C++ 语言程序,可以将 C++ 语言源代码编译成可执行文件或动态链接库。

虽然 gcc 和 g++ 是两个不同的编译器,但它们都基于同一套 GNU 工具链,并共享许多相同的功能和选项。因此,除了语言不同外,它们的使用方式和命令选项也非常相似。

需要注意的是,C++ 语言相对于 C 语言来说增加了一些特性,例如类、继承、多态等。如果您想编译 C++ 代码,建议使用 g++ 编译器,因为它可以更好地支持这些特性。而如果您只是编译 C 代码,gcc 编译器就足够了。

gcc -v
gdb -v
mingw32-make -v

注:要使用make,请把mingw32-make改成make

clang 和 gcc 是两个不同的 C/C++ 编译器,而 mingw-w64 是一个 Windows 上的编译和运行时环境。注意,mingw-w64 本身并不是一个编译器,而是一组库、头文件和实用工具。

gcc 需要 mingw-w64 环境才能在 Windows 上编译程序,加上最初(现已过时)的 mingw 项目就是专为 gcc 设计的,因此通常用 mingw64 代指 64 位的 gcc 和 mingw-w64 环境。

mingw64、ucrt64、clang64 都是 Windows 原生程序(不依赖 cygwin.dll),不过 mingw64 是很早就有的,后两者是最近(本回答最初写于2021年6月)才新加的,~~所以只是选一个用的话就 mingw64 就没问题。~~(划掉) 2022年11月25日更新:现在 msys2 官方推荐优先选择 ucrt64,经过一年多时间,现在 ucrt64 环境已经非常稳定了,而且对 UTF-8 语言环境的支持更好。

后两者先后刚出来时我还查过,简而言之,这三者的区别是:mingw64 与 ucrt64 都是用 gcc 编译器编译的 Windows 64 位程序,只不过它们链接到的 crt(C runtime)不同, mingw64 是链接到了 msvcrt ,而 ucrt64 则是链接到了 Windows 上新的 ucrt 上。

而 clang64 很好理解,就是用 clang 而非 gcc 来编译各种库。另外它也是链接到了 ucrt 而非 msvcrt。

三者是共同点是,它们都需要 mingw-w64 环境来进行编译。

以 zstd 为例:

( /usr/bin/zstd 就是依赖 cygwin 的非原生程序,这里的 msys-2.0.dll 实际上就是 msys2 版的 cygwin.dll )

如果你了解 archlinux 的打包的话(如果不了解可以在 archwiki 了解一下),也可以从这几个包的打包脚本(PKGBUILD)来观察区别。msys2 的打包脚本可以在 packages.msys2.org 在线查看。

在这个网站上搜索 zstd 得到这几个 zstd 包的构建脚本,发现这几个 Windows 原生的包其实是共用同一个构建脚本的。从 mingw_arch 变量来看,还有几个32位的包和 arm64 的包也是用这个打包脚本。只不过它会根据不同的 MINGW_PACKAGE_PREFIX 环境变量来执行不同的构建工具、构建出不同的包。

mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32' 'clangarm64')
makedepends=("${MINGW_PACKAGE_PREFIX}-gcc"
             "${MINGW_PACKAGE_PREFIX}-ninja"
             "${MINGW_PACKAGE_PREFIX}-cmake")

这里是 msys2 最初关于添加 ucrt64 与 clang64 构建的讨论:issue 6901


changelog:

  • 2022-11-25:跟随上游建议,推荐优先使用 ucrt64
  • 2022-06-13:更改措辞,让表述更加准确
  • 2022-01-24:添加了 msys2 官方文档的链接
  • 2021-06-07 20:13:init
[Running] cd "c:\Users\wangjiahao\Desktop\VScode\" && g++ hello.cpp -o hello && "c:\Users\wangjiahao\Desktop\VScode\"hello D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: Invalid argument D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/crtbegin.o: Invalid argument D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lstdc++: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmingw32: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lgcc: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmoldname: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmingwex: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmsvcrt: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lkernel32: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lpthread: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -ladvapi32: No such file or directory D:/浏览器/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lshell32: No such file or director
03-15
<think>嗯,用户遇到了MinGW编译C++程序时链接器找不到crt2.o和其他库文件的问题。我需要先理解这些错误的原因。根据用户提供的引用[1]和[2],看起来类似的问题通常是由于MinGW环境配置不正确或缺少必要的库文件导致的。比如,引用[1]中提到找不到-lmsvcrt的解决方法,需要安装支持32和64位的MinGW-w64。而引用[2]中的问题则是缺少MySQL库,用户尝试调整路径但未成功。 首先,crt2.o是C运行时初始化文件的一部分,属于MinGW的核心组件。如果链接器找不到它,可能是因为安装MinGW版本不完整或路径配置错误。同样,stdc++是GNU的标准C++库,缺少的话可能是没有安装对应的库或者路径没有正确包含。 接下来,我需要考虑可能的解决方案。用户可能没有正确安装完整的MinGW-w64工具链,或者环境变量没有正确设置。可能需要检查安装路径,确认是否存在这些库文件。此外,用户可能使用了错误的架构版本,比如需要32位但安装了64位,或者相反。 另外,用户提到的其他库如mingw32、msvcrt等,这些都是MinGW的基本依赖库,如果安装不完整,这些文件可能会缺失。解决方法可能包括重新安装MinGW-w64,并确保选择正确的架构和异常处理机制(如seh和sjlj)。同时,检查系统环境变量中的PATH是否包含了MinGW的bin目录,以及LIBRARY_PATH是否包含库目录。 还有可能需要检查编译命令是否正确,是否漏掉了某些参数或者指定了错误的库路径。用户可能在编译时没有正确配置链接器选项,或者项目配置有误。此外,使用MSYS2来管理MinGW环境可能更可靠,因为它提供了包管理工具,可以方便地安装所需的库。 总结下来,解决步骤可能包括:重新安装MinGW-w64完整版,检查路径配置,确认库文件存在,使用正确的架构,以及可能的包管理器安装缺失的库。此外,用户可能需要更新工具链或调整编译参数,确保所有依赖库都被正确链接。</think>### 解决MinGW链接器找不到crt2.o等库文件的方法 #### 问题分析 编译C++程序时出现`ld.exe cannot find crt2.o, stdc++, mingw32, msvcrt`等错误,通常是由于以下原因: 1. **MinGW安装不完整**,缺少核心运行时库或头文件。 2. **环境变量配置错误**,导致链接器无法定位库文件路径。 3. **架构不匹配**(如32位与64位混用)[^1]。 4. **库文件命名或版本冲突**,例如`libstdc++`未正确安装。 --- #### 解决方案步骤 1. **重新安装完整MinGW-w64** - 从官方源下载支持32/64位的**MinGW-w64**,选择与系统匹配的版本: - **架构**:`x86_64`(64位)或`i686`(32位) - **异常处理**:`seh`(64位推荐)或`sjlj`(32位兼容) - 下载地址:[MinGW-w64 - SourceForge](https://sourceforge.net/projects/mingw-w64/files/) - 安装时勾选所有基础组件(如`gcc`, `g++`, `binutils`, `mingw32-runtime`)。 2. **检查库文件路径** - 确认MinGW安装目录下存在缺失的库文件(如`crt2.o`位于`mingw/lib`或`mingw/x86_64-w64-mingw32/lib`)。 - 若文件缺失,手动复制或通过包管理器安装: ```bash # 使用MSYS2的包管理器(推荐) pacman -S mingw-w64-ucrt-x86_64-gcc ``` 3. **配置环境变量** - 添加MinGW的`bin`和`lib`目录到系统环境变量: ```bash # 示例(路径需替换为实际安装位置) export PATH="/mingw64/bin:$PATH" export LIBRARY_PATH="/mingw64/lib:$LIBRARY_PATH" ``` - 在Windows系统中,通过“系统属性→高级→环境变量”设置。 4. **验证编译命令** - 确保编译命令包含必要的库路径和链接参数: ```bash g++ main.cpp -L/mingw64/lib -lstdc++ -static -o output.exe ``` 5. **使用MSYS2替代原生MinGW** - MSYS2提供更稳定的包管理,可避免手动配置路径: ```bash pacman -Syu # 更新包列表 pacman -S mingw-w64-x86_64-toolchain # 安装完整工具链 ``` --- #### 关键注意事项 - 若问题涉及`-lmsvcrt`或`-lkernel32`,需确保安装时勾选了Windows API支持[^1]。 - **避免混合使用不同版本的MinGW**,可能导致符号冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值