You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 hw
    
    然后直接运行hw.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:25:21