0%

记MinGW问题

MinGW

一、版本

首先遇到的是版本问题,MinGW - Minimalist GNU for Windows download | SourceForge.net 这个网站上mingw版本都比较老,而且g++,gdb 版本比较低,我用 gdb 调试 string出现问题,老是闪退(可能是与后面环境变量有关)。

官网MinGW-w64,这个网站上版本比较多,工具链有很多种,不知道选择哪个,windows可以选择 Mingw-builds。跳转到 github 下载,Releases · niXman/mingw-builds-binaries (github.com)

直接下载最新版本,但是还是有许多,不清楚选哪个。注意各个的区别。

image-20230911224604324

选择首先,64位 windows 应该选择 x86_64的。

win32与posix区别:

POSIX是一种UNIX API标准,而Win32是Windows的API标准。这两者之间有一些区别,例如在mingw-w64中,使用posix线程将启用C++11/C11多线程功能,并使libgcc依赖于libwinpthreads。而使用win32线程则不会启用C++11多线程功能。

dwarf和seh的区别:

DWARF(DW2,dwarf-2)和SEH(零开销exception)是两种不同的异常处理模型。DWARF仅适用于32位系统,没有永久的运行时开销,但需要整个调用堆栈被启用。SEH将可用于64位GCC 4.8。

msvcrt和ucrt的区别:

MSVCRT(Microsoft Visual C++ Runtime)和UCRT(Universal C Runtime)是Microsoft Windows上的两种C标准库变体。MSVCRT在所有Microsoft Windows版本中都默认可用,但由于向后兼容性问题,它已经过时,不兼容C99并且缺少一些功能。而UCRT是一个较新的版本,也是Microsoft Visual Studio默认使用的版本。它应该像使用MSVC编译的代码一样工作和表现。其中 visual studio 里面内置 MSVCRT,并且随着 visual studio版本升级不断更新。

我这里选择的是x86_64-13.1.0-release-win32-seh-ucrt-rt_v11-rev1.7z

二、环境变量

配置环境变量之后,编写了 hello world 程序。

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;

int main()
{
cout << "hello world" << endl;
return 0;
}

单独使用 g++ 编译没有问题,gdb 调试也没有问题,但是使用 cmake 就会有问题,运行没有输出,调试的话,在 cout 处出现了 segmentation fault.不清楚怎么回事。好像是因为 libstdc++-6.dll 版本太老的问题。

后来换用了更低版本的 mingw,这段代码没有问题了,但是在代码里写了 vector<vector<int>> a,又出现问题,什么都没有输出,而且调试时gdb报错,

vscode ERROR: During startup program exited with code 0xc0000139.

后来搜到是环境变量的问题,在 mingw 的环境变量前面还有别的 mingw存在。调整过后,问题仍然存在。

后来发现是 libstdc++-6.dll 的问题,环境变量里面存在多个 libstdc++-6.dll,而且版本不一致。通过 everything 搜索,找到了 tesseract ocr工具里面也存在这个动态链接库,把环境变量里面 tesseract 去掉就没有问题了。

问题解决,cmake也能正常使用,现在使用的是最新版的mingw64 x86_64-13.1.0-release-win32-seh-ucrt-rt_v11-rev1.7z