在调试程序的时候遇到了一个奇葩的问题,C++ 无法使用 string。最后发现居然是 MinGW64 的问题

起因

在帮助别人调试 vscode-debug-visualizer 这个插件的时候,遇到了无法出结果的问题。经过一系列定位后发现,居然是使用了 string 就无法运行,而编译不会出错。

测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//main.c
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
// visualize `myGraphJson`!
string myGraphJson = "{\"kind\":{\"graph\":true},"
"\"nodes\":[{\"id\":\"1\"},{\"id\":\"2\"}],"
"\"edges\":[{\"from\":\"1\",\"to\":\"2\"}]}";
cout << myGraphJson;
}

错误现象

使用编译指令如下

1
g++ -g main.c -o main.exe

结果正常,运行

1
.\main.exe

输出为空

使用 gdb 进行 debug。错误如下

1
ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". During startup program exited with code 0xc0000139.

解决方案

stackoverflow 上找到解决方案。

MinGW 的安装目录里面找到 bin 文件夹。将里面的 libstdc++-6.dll 拷贝到工作目录。目录结构如下

1
2
3
4
5
+ .vscode
launch.json
tasks.json
libstdc++-6.dll
main.cpp

再次进行编译、运行

1
2
g++ -g main.c -o main.exe
.\main.exe

输出

1
{"kind":{"graph":true},"nodes":[{"id":"1"},{"id":"2"}],"edges":[{"from":"1","to":"2"}]}

gdb 的 debug 结果正常

吐槽

这个问题在 7 年前就被提出了,居然现在还有。MinGW 真是坑啊,用了环境变量也没用。