使用 cout 打印字符串时C++代码块中的运行时错误<<

C++ runtime errors in CodeBlocks when printing strings with cout <<

本文关键字:lt 运行时错误 代码 打印 cout 字符串 C++ 使用      更新时间:2023-10-16

我最近开始使用CodeBlocks,并开始遇到奇怪的运行时错误,我可以追溯到使用cout<lt;。例如,即使是以下。。

#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

我的一次性评论最终帮助解决了这个问题,所以在这里它被打包为未来用户的答案:

这家伙也有类似的问题,最终成为了一个链接器问题,他固定的修复是线程中的最后一篇文章,尽管正在阅读整个线程可能对您有用。

长话短说:Borland编译器使用起来有点过时和烦人。最终成为borland内部的一个链接器问题。最好使用不同的编译器,如GCC/G++或Visual Studio编译器。

这个答案是为了详细说明问题的根本原因。

程序崩溃的原因是链接了错误的运行库。具体来说,您的示例被编译为单线程对象文件(默认),但链接步骤是使用多线程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-oexample.obj-c example.cpp
ilink32-ap example.obj c0x32,example.exe,,cw32mt.lib import32.lib,,

第三种更容易出错的方法是不自己调用链接器。相反,让编译器间接驱动链接器(类似于gcc):

bcc32-tWM-oexample.obj-c example.cpp
bcc32-tWM example.obj-eexample.exe

对于您的简单示例,它甚至可以缩短为:

bcc32-example.exe example.cpp

最后,您可以多次通过-tW开关。例如,此命令将您的示例编译为具有多线程支持和动态运行时链接的控制台程序:

bcc32-tWM-tWR-tWC-eexample.exe example.cpp

生成的example.exe可执行文件要小得多,其导入表中有一个CC3250MT.DLL条目,用于确认borland运行时是动态链接的。

在没有首先调查用户错误作为潜在原因的情况下,我们不应该假设一个无法运行的程序是由不符合标准或我们使用的工具中的错误引起的(即使在这种情况下,这样做很诱人)。在OP的情况下,代码::block IDE没有为所使用的工具链设置正确的命令。