2012-10-20 96 views
4

我創建在Visual Studio 2012個快遞(爲當然的桌面)的空C++項目,並增加了一些隨機的基本代碼:這是什麼「CRT未初始化」錯誤?

#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:\用戶\ XXXXX \文檔\ P ...

R6030

  • CRT沒有初始化

所以,這個基本的程序將無法運行由於運行時庫的一些問題,我無法弄清楚!

任何想法?我只想知道這裏發生了什麼。提前致謝!編輯:僅供參考,這是所有在發佈模式下完成的。

+0

你說你編譯並開始調試,但你也說你在發佈模式下工作。你確定這兩點? – alestanis

+0

選中此項 - http://blogs.technet.com/b/virtualworld/archive/2010/07/07/r6030-crt-not-initialized.aspx – user93353

+1

@alestanis可以調試發佈版本,只要構建編譯時打開調試信息;即使它不是,你仍然可以附加一個調試器,雖然 – stijn

回答

2

使用「空項目」模板啓動一個新項目有導致麻煩的訣竅。您可能更改了另一個項目設置,它會導致程序從main()方法開始,而不是正常的入口點,即CRT啓動函數。初始化CRT,然後調用main()。很難猜測你是如何做到的,特別是當你談論改變連接器設置以獲得/ MT時。這是一個編譯器設置。

通過使用Win32 + Win2控制檯應用程序項目模板來代替成功陷阱。刪除預生成的代碼,減去頂部的#include <stdafx.h> line。至少你現在有一個起點,可以幫助我們幫助你解決問題。並且不要跳過「Hello world」程序。

+0

看起來我只是擊敗你的答案(似乎約10秒)!另外,我的意思是/ MT作爲編譯器設置,我的錯誤。 – Archimaredes

+0

謝謝你本來是我的解決方案,但! :d – Archimaredes

1

我解決了這個問題,這是我的錯。

我已經在鏈接器設置中明確地將入口點設置爲main,此時它應該保持默認狀態。

使用CRT的控制檯程序實際上有一個入口點,稱爲_mainCRTStartup,它在調用程序的main函數之前初始化CRT,這幾乎是一個'僞入口點'。

如果您自己在鏈接器設置中設置入口點,則永遠不會調用_mainCRTStartup,所以CRT永遠不會初始化;程序從main開始,不能執行CRT功能。

我只是刪除了明確定義的入口點和一切工作。

你每天都會學到新的東西。