为什么我所有的 C++ 程序都以 0xc0000139 退出?

问题描述 投票:0回答:5

我正在尝试自学 C++ 编程,并在安装了 g++ 的 Windows 上使用 Cygwin。一切都进展顺利,直到我开始声明字符串变量。在 cout 中使用字符串文字不会导致任何问题,但一旦我声明字符串变量,程序将不再运行。

#include <iostream>
#include <string>

int main ()
{
  std::string mystring = "Test";
  std::cout << mystring;
  return 0;
}

前面的代码编译没有问题,但运行时没有产生任何输出。 GDB 为我提供了以下内容:

(gdb) run
Starting program: /cygdrive/c/Projects/CPP Test/string.exe
[New Thread 8416.0x2548]
[New Thread 8416.0x2510]
[New Thread 8416.0x1694]
[New Thread 8416.0x14f4]
[Thread 8416.0x1694 exited with code 3221225785]
[Thread 8416.0x14f4 exited with code 3221225785]
During startup program exited with code 0xc0000139.

根据我设法收集的信息,这是 DLL 的某种入口点问题,但我可能完全错了。

有谁知道我做错了什么或配置错误以及如何修复它?

c++ crash cygwin
5个回答
3
投票

我不确定问题到底是什么(如果有人知道我会很感激!),但我能够通过从 GCC 5.2.0 降级到 GCC 4.9.3 来自己解决这个问题。


3
投票

当 Windows 无法加载 dll 文件时,会发出错误代码 0xc0000139。 可能的原因是安装了多个不同版本的编译器。 当您在 PC 上安装多个带有嵌入式 mingw 的软件时,例如 Visual C、Vagrant、Omnet++,可能会发生这种情况。

对我来说,一个简单的解决方法是以不同的方式运行程序:我不是从 GUI 运行我的软件 (Omnet++),而是从 mingwenv.cmd 命令行运行它。这解决了问题。

可以在 Rudolf 2017 年 9 月 18 日上午 11:35:13 这里的回答中找到更聪明的解决方案。简而言之,他建议小心地临时更改系统的环境变量;因此,找到冲突的错误 dll,并将其删除。 下面田斌的回答可以看图。解释一下。


0
投票

我在使用 Windows 10、mingw 编译和 gcc-8.1.0 混合发布和调试版本时遇到了同样的问题。

我通过清理和重新编译所有内容解决了这个问题:

cd ${MY_BUILD}
make clean
cmake ${MY_SOURCE} -DCMAKE_BUILD_TYPE=Debug
make -j4
gdb ./bin/my_program.exe # -> works
./bin/my_program.exe # -> no more problem

0
投票

回答是因为我没有代表发表评论 - 为了扩展 @Ultra Junkie 的评论,我在新安装的 MSYS2 副本上遇到了这个问题,只是试图用 C++ 编译 helloworld。我使用“Sysinternals”进程监视器查看失败的 helloworld.exe 的所有系统调用,发现它从 QEMU 安装中找到 libstc++6 版本,而不是从 C:\msys64\ucrt64在 helloworld 所期待的地方。我删除了 QEMU,helloworld 立即开始正常运行。不确定下次需要 QEMU 时我会做什么,但是是的,问题可能是由于程序发现它正在搜索的 DLL 版本不兼容而引起的。


0
投票

C:\Program Files\Git\mingw64\bin
最终在我的环境变量中具有最高优先级。

基本上任何测试程序都会采用错误的库

libstdc++-6.dll

,因此将我的 msys64 路径

C:\msys64\ucrt64\bin
移动到最高优先级为我解决了这个问题。
    

© www.soinside.com 2019 - 2024. All rights reserved.