4

我在 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 汇编的更多信息。)

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

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

运行时错误!

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

R6030

  • CRT 未初始化

因此,由于运行时库的一些问题,这个基本程序将无法运行,我无法弄清楚!

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

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

4

2 回答 2

2

使用“空项目”模板开始一个新项目有制造麻烦的诀窍。您可能更改了另一个项目设置,导致您的程序从 main() 方法而不是正常的入口点 CRT 启动函数启动。它初始化 CRT,然后调用 main()。很难猜出您是如何做到的,尤其是当您谈论更改链接器设置以获取 /MT 时。那是编译器设置。

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

于 2012-10-20T13:08:56.157 回答
1

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

我已经在链接器设置中明确设置了入口点main,它应该保留默认值。

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

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

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

你每天学习新的东西。

于 2012-10-20T13:08:47.230 回答