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)。
直接下载最新版本,但是还是有许多,不清楚选哪个。注意各个的区别。
选择首先,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 |
|
单独使用 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。