Windows MSYS2下g++编译的Hello World程序段错误,疑标准库缺失如何解决?
解决MinGW编译C程序触发gnuplot libstdc-6.dll段错误的问题
问题概述
按官方教程安装MinGW的gcc/g后,编译C Hello World程序无输出,调试发现触发SIGSEGV段错误,错误来自C:\Program Files\gnuplot\bin\libstdc++-6.dll,关联到main函数第4行;但C语言版本编译运行正常。
原因分析
程序运行时优先加载了gnuplot目录下的libstdc++-6.dll,而非MinGW自带的标准库文件。gnuplot的libstdc版本与当前使用的MinGW版本不兼容,导致C标准库调用时出现段错误。C语言程序依赖的是libc库,不受此影响,因此可以正常运行。
解决方案
- 调整系统PATH优先级:打开系统环境变量设置,找到PATH变量,将MinGW的bin目录(例如
C:\mingw64\bin)移动到C:\Program Files\gnuplot\bin之前,确保系统优先加载MinGW自带的标准库。 - 验证库加载路径:打开命令提示符,执行
where libstdc++-6.dll,确认输出的第一个路径是MinGW的bin目录;同时执行where g++确认使用的是MinGW的编译器。 - 重新编译运行:删除之前生成的
hw.o和hw.exe文件,重新执行编译命令:
然后直接运行g++ -c -Wall -pedantic hw.cpp g++ hw.o -o hwhw.exe(Windows环境下无需加./)。 - 备选方案:如果PATH调整无效,可将MinGW bin目录下的
libstdc++-6.dll复制到你的C++程序所在目录,强制程序加载该版本的库;或临时移除PATH中gnuplot的路径条目进行测试。
相关代码
hw.cpp
#include <iostream> int main() { std::cout << "Hello World!"; return 0; }
helloworld.c
#include <stdio.h> int main() { printf("Hello, World!"); return 0; }
gdb调试信息
[New Thread 2664.0x530] [New Thread 2664.0xe9c] [New Thread 2664.0x2d80] Thread 1 received signal SIGSEGV, Segmentation fault. 0x00007fff76446326 in ?? () from C:\Program Files\gnuplot\bin\libstdc++-6.dll (gdb) backtrace #0 0x00007fff76446326 in ?? () from C:\Program Files\gnuplot\bin\libstdc++-6.dll #1 0x00007fff764c4759 in ?? () from C:\Program Files\gnuplot\bin\libstdc++-6.dll #2 0x00007fff764d3187 in ?? () from C:\Program Files\gnuplot\bin\libstdc++-6.dll #3 0x00007ff6eb141476 in main () at hw.cpp:4
内容的提问来源于stack exchange,提问作者WCSin
相关产品推荐
相关产品推荐

