我正在编写一些接口代码来从 fortran 调用 c++ 例程,这就是为什么我将这些方法转储到外部“C”块中的原因。在 Windows 10 下使用 g++.exe(x86_64-win32-seh-rev1,由 MinGW-W64 项目构建)7.2.0 编译时,我在声明 ifstream 对象时遇到分段错误。我将其分解为以下代码片段:
测试仪.cpp
#include <fstream>
void x(){
std::ifstream infile;
}
extern "C"
{
void whatever() {
}
}
int main(){
x();
return 0;
}
我正在使用以下命令进行构建:g++ tester.cpp -o tester.out -O3。该程序在使用 -O0 构建时运行正常,但在 -O1、-O2 和 -O3 时崩溃。在 Windows 下使用 msvc 和在 Linux 下使用 g++ 8.30 编译不会产生分段错误。程序崩溃需要 extern "C" 块和对 x() 的调用。
运行 gdb backtrace 会得到以下输出:
Thread 1 received signal SIGSEGV, Segmentation fault.
0x000000006fce18b2 in ?? ()
from C:\Program Files\Git\mingw64\bin\libstdc++-6.dll
(gdb) backtrace
#0 0x000000006fce18b2 in ?? ()
from C:\Program Files\Git\mingw64\bin\libstdc++-6.dll
#1 0x000000006fcf7b6c in ?? ()
from C:\Program Files\Git\mingw64\bin\libstdc++-6.dll
#2 0x000000006fcf9b41 in ?? ()
from C:\Program Files\Git\mingw64\bin\libstdc++-6.dll
#3 0x000000000040163a in std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream (this=0x61fc20, __in_chrg=<optimized out>,
__vtt_parm=<optimized out>)
at C:/mingw64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/fstream:482
#4 x () at tester.cpp:4
#5 0x0000000000402ede in main () at tester.cpp:14
这是 mingw 的错误还是我错过了什么。std::ifstream 在 Windows 上的发布版本中崩溃,退出代码为 0xC0000409:可能与未知软件异常有关。