这个“CRT未初始化”错误是什么?

时间:2012-10-20 12:06:49

标签: c++ winapi visual-studio-2012 runtime-error crt

我在Visual Studio 2012 Express中创建了一个空C ++项目(当然是桌面版),并添加了一些随机基本代码:

#include <cstdio>
#include <cstdlib>

typedef struct examplestruct
{
    unsigned char num1;
    unsigned short num2;
    unsigned long num3;
    unsigned long long num4;
} EXAMPLESTRUCT;

void examplefunction(unsigned long *num, int num2)
{
    *num += num2;
    return;
}

int main(int nArgs, char **pszArgs)
{
    EXAMPLESTRUCT ExStructInstance = {0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF};
    printf("%d, %d, %u, %ull\n", ExStructInstance.num1, ExStructInstance.num2, ExStructInstance.num3, ExStructInstance.num4);
    unsigned long num5 = ExStructInstance.num1 + ExStructInstance.num2;
    printf("%d\n", num5);
    examplefunction(&num5, 10);
    printf("%d\n", num5);
    system("pause");
    return 0;
}

(如果你想知道这到底是什么,我正在拆解创建的可执行文件以观察优化编译器的行为,并了解有关x86汇编的更多信息。)

在项目设置中的Linker下,我为运行时库选择了Multi-threaded (/MT),因此它将静态链接它。

我编译并开始使用F5进行调试,并在消息框中立即收到此错误:

  

运行时错误!

     

程序:C:\ Users \ xxxxx \ Documents \ P ...

     

R6030

     
      
  • CRT未初始化
  •   

因此,由于运行时库存在一些问题,这个基本程序无法运行,我无法弄明白!

有什么想法吗?我只想知道这里发生了什么。提前谢谢!

编辑:仅供参考,这一切都是在发布模式下完成的。

2 个答案:

答案 0 :(得分:2)

使用“空项目”模板启动一个新项目有一个导致麻烦的诀窍。您可能更改了另一个项目设置,该设置会导致程序以main()方法而不是正常入口点(CRT启动函数)启动。其中初始化CRT,然后调用main()。很难猜到你是怎么做到的,尤其是当你谈到将链接器设置改为get / MT时。这是一个编译器设置。

使用Win32 + Win2控制台应用程序项目模板代替成功。删除预先生成的代码,减去顶部的#include <stdafx.h> line。至少你现在有一个起点可以帮助我们帮助你解决问题。不要跳过“Hello world”计划。

答案 1 :(得分:1)

我解决了问题,这是我的错。

我在链接器设置中明确地将入口点设置为main,而它应该保留为默认值。

使用CRT的控制台程序实际上有一个名为_mainCRTStartup的入口点,它在调用程序的main函数之前初始化CRT,该函数几乎是伪造的。切入点&#39;。

如果您在链接器设置中自己设置入口点,则永远不会调用_mainCRTStartup,因此CRT永远不会被初始化;该程序从main开始,无法执行CRT功能。

我只是删除了明确定义的入口点,一切正常。

你每天都学到新东西。