我最近开始使用CodeBlocks并开始遇到奇怪的运行时错误,我已经追溯到使用cout<<来打印字符串。例如,甚至以下......
#include <string>
#include <iostream>
int main()
{
std::string str;
str = "Hi!";
std::cout << str << std::endl;
return 0;
}
导致错误。它将编译正常(使用Borland),但是当我运行它时,我得到一个弹出窗口,说'test.exe已经停止工作',在控制台中我收到消息:
Process returned -1073741819 (0xC0000005) execution time : 1.526 s
Press any key to continue.
它在MS Visual C ++中编译并运行良好,在Ubuntu中使用G ++ ..任何想法都将不胜感激!
干杯, Weatherwax
答案 0 :(得分:2)
我的一次性评论最终有助于解决问题所以在这里它被打包成未来用户的答案:
This家伙有一个类似的问题,最终成为他的链接器问题 固定。修复是线程中的最后一篇文章,虽然阅读 整个线程可能对你有用。
长话短说:Borland编译器有点陈旧且使用起来很烦人。结束了作为borland内部的链接器问题。最好使用不同的编译器,如GCC / G ++或Visual Studio编译器。
答案 1 :(得分:2)
这个答案是为了详细说明问题的根本原因。
崩溃程序的原因是因为链接了错误的运行时库。具体来说,您的示例编译为单线程目标文件(默认值),但链接步骤使用多线程 cw32mt.lib
运行时 - “mt”末尾的后缀表示多线程。
解决方案是确保编译程序的运行时使用与您链接的运行时匹配。有几种方法可以做到这一点。
重要的bcc32编译开关:
-tW Windows GUI program. WinMain() is expected
-tWC Windows Console program. main() is expected. default.
-tWR Use dynamically linked runtime. Absence implies static runtime linkage.
-tWM Use multithreaded runtime. Absence implies single thread.
将您的示例程序编译为单线程,如下所示:
bcc32 -example.obj -c example.cpp
ilink32 -ap example.obj c0x32,example.exe ,, cw32.lib import32.lib ,,
或者你可以像这样编译多线程(注意与-tWM
匹配的cw32mt.lib
开关):
bcc32 -tWM -example.obj -c example.cpp
ilink32 -ap example.obj c0x32,example.exe ,, cw32mt.lib import32.lib ,,
更容易且不易出错的第三种方法是不自行调用链接器。相反,让编译器间接驱动链接器(类似于gcc):
bcc32 -tWM -example.obj -c example.cpp
bcc32 -tWM example.obj -eexample.exe
对于您的简单示例,它甚至可以缩写为:
bcc32 -eexample.exe example.cpp
最后,您可以多次传递-tW
开关。例如,此命令将您的示例编译为具有多线程支持和动态运行时链接的控制台程序:
bcc32 -tWM -tWR -tWC -eexample.exe example.cpp
生成的example.exe
可执行文件要小得多,并且其导入表有一个CC3250MT.DLL
条目,用于确认borland运行时是动态链接的。
我们不应该假设一个不起作用的程序是由不符合标准或我们正在使用的工具中的错误引起的没有首先将用户错误视为潜在原因(即使在这种情况很有吸引力)。在OP的情况下,code :: block IDE没有为正在使用的工具链设置正确的命令。