unresolved external symbol _main相關錯誤

 在創建MFC項目時, 不使用MFC AppWizard嚮導, 如果沒有設置好項目參數, 就會在編譯時產生很多連接錯誤, 如error LNK2001錯誤, 典型的錯誤提示有:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex





下面介紹解決的方法:

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] --> 選擇"Link"屬性頁,

在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.爲了清空,將debug目錄刪了。結果編譯時出如下錯誤:
fatal error c1083: cannot open precompiled header file: /’debug/xxx.pch/’:
no such file or directory
怎麼搞都不行。
歸結爲同樣問題的錯誤:
fatal error c1010: unexpected end of file while looking for precompiled
header directive
原來,xxx.pch是預編譯頭文件生成的文件。在project-settings裏面,選中編譯的項目和c/c++頁,在下拉框選precompiled headers, 下面有四個選項。
        1.不使用預編譯頭;
        2.自動使用預編譯頭;
        3.從頭文件創建預編譯頭,指定頭文件;
        4.使用預編譯頭文件stdafx.h
如果預編譯頭文件是stdafx.h,那麼其他的文件都選4. 而stdafx.cpp選3,並且頭文件選stdafx.h
出現第一個編譯錯誤問題時,只需要把stdafx.cpp重編譯一下,預編譯的xxx.pch就生成了。而出現第二個編譯問題時,需要把stdafx.h包含在文件的最開始。
鏈接錯誤:
使用了靜態庫,有時出下面的錯誤:
libcd.lib(crt0dat.obj) : error lnk2005: __cinit already defined in libcmt.lib(crt0dat.obj)
libcd.lib(crt0dat.obj) : error lnk2005: _exit already defined in libcmt.lib(crt0dat.obj)
libcd.lib(crt0dat.obj) : error lnk2005: __exit already defined in libcmt.lib(crt0dat.obj)
這是庫和可執行程序使用了不同的庫所引起的衝突。在主程序中的project-settings的link頁,下拉框選input項,
在ignore librarys中增加:
libc.lib,msvcrt.lib,mfc42.lib
若是debug版,則應爲:
libcd.lib,msvcrtd.lib,mfc42d.lib。
這時就可以編譯通過了。
類似問題:
error lnk2001: unresolved external symbol __afxforceexclude
這是因爲選了ignore all default libraries引起的,去掉就可以了。

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