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

8

我正在尝试学习C++编程,并在Windows上使用安装有g ++的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的入口点有关的问题,但我可能完全错了。

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


1
你的代码在Windows 10上使用gcc 4.8.1编译正常,并且输出了预期的结果'Test'。你是否在其他C++程序中遇到了相同的问题,或者这与你提供的代码有关?另外,你使用了哪些编译器标志来编译代码? - JonatanE
我还没有深入研究它,但我可以编译其他代码。声明字符串变量似乎是导致问题的原因。我还没有尝试声明任何其他类的变量,所以我不确定它是否是与字符串或类总体有关的问题。我正在使用通过Cygwin安装程序下载的Win10上的GCC 5.2.0-1。我不确定我使用了什么标志,可能是默认值。我使用g++ -g string.cpp -o string.exe进行编译。 - Zell Faze
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Zell Faze
你可能已经更新了GCC,但是将库保留在4.9.x版本,它们是独立的软件包。二进制兼容性很脆弱。 - Euri Pinhollow
5个回答

3
错误代码0xc0000139是在Windows无法加载dll文件时发出的。 可能的原因是安装了几个不同版本的编译器。 当您在计算机上安装几个带有内置mingw的软件时,例如Visual C、Vagrant、Omnet++,可能会出现这种情况。
对我而言,一个简单的解决方法是以不同的方式运行程序:我从mingwenv.cmd命令行中运行我的软件(Omnet++),而不是从GUI中运行。这解决了问题。
更聪明的解决方案可以在Rudolf于2017年9月18日11:35:13 AM 此处的答案中找到。简而言之,他建议小心地临时更改系统的环境变量;从而找到冲突的错误dll,并将其删除。 在Tian Bin下面的答案中,您可以看到说明它的Figs。

2

我不确定具体的问题是什么(如果有人知道,我会很感激!),但是我通过将GCC 5.2.0降级到GCC 4.9.3来解决了这个问题。


4
你可以尝试使用类似 Dependency Walker(http://www.dependencywalker.com/)的工具来诊断缺失 DLL 的问题。 - Michael Burr
我之前在 Git Bash 提示符 ~v2.3 下运行 VS Code 1.68.1,但不是最新版本(此时最新版本为 2.37),并使用 MSYS Mingw64 GCC 12.1。我喜欢从 Git Bash 提示符下运行 VS Code,因为这样我可以将 git bash 作为默认 shell 并使用环境变量。当我尝试调试程序时,我也遇到了 gdb 0xc0000139 错误。当我在 Git Bash 外独立运行 VS Code 时,它可以正常工作。然后我使用命令 "git update-git-for-windows" 升级了 GitBash。这将我带到了 Git 版本 2.37.0.windows.1。现在我可以从 Git Bash 运行 VS Code 并成功使用 gdb。 - Dave Guenther

0
回答是因为我没有足够的声望来评论 - 为了进一步解释@Ultra Junkie的评论,我在新安装的MSYS2上遇到了这个问题,只是尝试编译C++中的helloworld。我使用Sysinternals的Process Monitor来查看我失败的helloworld.exe的所有系统调用,并发现它找到了一个来自QEMU安装的libstc++6版本,而不是来自C:\msys64\ucrt64\bin,这是helloworld所期望的。我删除了QEMU,helloworld立即开始正确运行。不确定下次需要QEMU时该怎么办,但是是的,问题可能是由于程序找到了不兼容的DLL版本而引起的。

这并没有回答问题。一旦你拥有足够的声望,你就可以在任何帖子上发表评论;相反,提供不需要提问者澄清的答案。- 来自审核 - Jesper Juhl
嗯,好的,你能解释一下为什么这个回答没有解决问题吗?发帖者提出了一个问题,我遇到了同样的问题并解决了它。所以我详细说明了我是如何诊断问题的,我诊断问题是什么,并且我是如何解决的。请解释一下其中哪一部分不有用,我会愿意自己删除这个帖子。 - Dave Atkinson

0
这是在安装git之后发生在我身上的事情。
C:\Program Files\Git\mingw64\bin 最终成为了我的环境变量中优先级最高的路径。

基本上,任何测试程序都会使用错误的库 libstdc++-6.dll,所以将我的msys64路径 C:\msys64\ucrt64\bin 移动到最高优先级解决了这个问题。

我遇到了相同的情况,但是在将mingw的优先级调高于git/mingw之后,问题并没有得到解决。 - undefined

0

我在使用Windows 10、mingw编译器和gcc-8.1.0时,因为混淆了Release和Debug版本而遇到了同样的问题。

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

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

我知道这个线程有点老了,但是两天前我编译wxWidgets应用程序时遇到了同样的错误。它在一个机器上没有问题,但在另一个机器上却不行,最终导致了解决方案:路径中的错误条目导致使用了错误的dll。简单的原因,大的影响... - Ultra Junkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接