3

我最近开始使用 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++ 编译和运行良好。任何想法将不胜感激!

干杯,风蜡

4

2 回答 2

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 -oexample.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 -eexample.exe 示例.cpp

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

bcc32 -tWM -tWR -tWC -eexample.exe 示例.cpp

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

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

于 2013-06-28T21:22:58.883 回答
2

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

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

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

于 2013-06-28T17:33:09.513 回答