这个"CRT not initialized"错误是怎么回事?

What's with this "CRT not initialized" error?

本文关键字:怎么回事 错误 initialized CRT not 这个      更新时间:2023-10-16

我在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, %ulln", ExStructInstance.num1, ExStructInstance.num2, ExStructInstance.num3, ExStructInstance.num4);
    unsigned long num5 = ExStructInstance.num1 + ExStructInstance.num2;
    printf("%dn", num5);
    examplefunction(&num5, 10);
    printf("%dn", num5);
    system("pause");
    return 0;
}

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

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

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

运行时错误!

程序:C: Users xxxxx documents p ...

R6030

  • CRT不初始化

因此,由于运行时库的某些问题,这个基本程序不会运行,我无法找到!

有什么想法吗?我想知道这里发生了什么。预先感谢!

编辑:fyi,这都是在发布模式下完成的。

使用"空项目"模板启动一个新项目,具有造成麻烦的诀窍。您可能更改了另一个项目设置,该设置会导致您的程序从Main()方法而不是正常的入口点(CRT启动功能)启动。初始化CRT,然后调用main()。很难猜测您是如何做到的,尤其是当您谈论将链接器设置更改为/MT时。那是编译器设置。

通过使用WIN32 WIN2 CONSOLE应用程序模板落入成功坑中。删除预生成的代码,减去顶部的#include <stdafx.h> line。至少您现在有一个起点可以帮助我们解决问题。并且不要跳过" Hello World"程序。

我解决了问题,这是我的故障。

我已经在链接器设置中明确将入口点显式设置为main

使用CRT的控制台程序实际上具有一个称为_mainCRTStartup的入口点,该入口点在调用程序的main函数之前初始化CRT,这几乎是"伪入口点"。

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

我只是简单地删除了明确定义的入口点,一切都起作用。

您每天都学到新知识。