VC常見的幾個error

對於VC初學來說,最爲頭痛的莫過於編譯鏈接時出現的以大堆莫名其妙的error了,現在就讓我們看看一些經常出現的error和解決辦法:

1. Windows子系統設置錯誤, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Windows項目要使用Windows子系統, 而不是Console, 可以這樣設置:

[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:console改成/subsystem:windows

2. Console子系統設置錯誤, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

控制檯項目要使用Console子系統, 而不是Windows, 設置:

[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:windows改成/subsystem:console

3. 程序入口設置錯誤, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

通常, MFC項目的程序入口函數是WinMain, 如果編譯項目的Unicode版本, 程序入口必須改爲wWinMainCRTStartup, 所以需要重新設置程序入口:

[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 線程運行時庫設置錯誤, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

這是因爲MFC要使用多線程時庫, 需要更改設置:

[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Code Generation,
再在Use run-time library中選擇Debug Multithreaded或者multithreaded

其中,
Single-Threaded                單線程靜態鏈接庫(release版本)
Multithreaded                  多線程靜態鏈接庫(release版本)
multithreaded DLL              多線程動態鏈接庫(release版本)
Debug Single-Threaded          單線程靜態鏈接庫(debug版本)
Debug Multithreaded            多線程靜態鏈接庫(debug版本)
Debug Multithreaded DLL        多線程動態鏈接庫(debug版本)

單線程: 不需要多線程調用時, 多用在DOS環境下
多線程: 可以併發運行
靜態庫: 直接將庫與程序Link, 可以脫離MFC庫運行
動態庫: 需要相應的DLL動態庫, 程序才能運行
release版本: 正式發佈時使用
debug版本: 調試階段使用

5、Fatal Error C1010
unexpected end of file while looking for precompiled header directive
這一般是由於使用了參數/Yu"stdafx.h",意思是在每個文件中都應該使用#include來包含這個頭文件。一般改正,就是在每個。CPP文件中包含這個文件就可以。


6、LNK2001 on __beginthreadex and __endthreadex
這是一個非常常見的鏈接錯誤。原因是由於在VC3。0以後所有的MFC類都是線程安全的,在MFC類庫中使用了Thread Local Storage (TLS)提供預處理的數據。因此如果程序中包含了"stfafx.h"頭文件或者使用了,MFC類庫中的類就會使用MSVCRTx0.DLL 來進行鏈接。改正方法如下:
On Visual C 2.x, 5.0, and 6.0: 
     Select the Project menu, and then continue Steps 2 through 5 below.
On Visual C 4.x: 
      Select the Build menu.
      Select the Settings... option.
     Select the C/C++ tab.
     Select Code Generation on the Category list box.
     Finally, make a selection other than Single-Threaded on the Use Run Time Library list box.
      如果使用了"Multithreaded using DLL"方式還要求在預處理符號中加上_AFXDLL 符號.
      還在LIBC。LIB是C Runtime的靜態鏈接庫。
    MSVCRTx0.DLL 是C Runtime的動態鏈接庫。
    如果程序中包含了任何MFC代碼,或者編譯使用了/MT選項,都要求使用多線程庫。
    爲什麼在程序中包含了"StdAfx.h"文件也會出現這個連接錯誤呢?是由於在"StdAfx.h"中使用了MFC類,並且重載了new等操作符,如果在程序中使用了NEW等就會出現鏈接錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章