剛學WinAPI編譯遇到不少問題,
LNK2019: 無法解析的外部符號 _main,該符號在函數 ___tmainCRTStartup 中被引用 MSVCRTD.lib test。
這個問題表明你新建的是一個main類型函數(控制台程序),而你的程序中有窗口程序,顯然是個win32函數,解決方法:項目-屬性-鏈接器-系統-子系統-把控制台該為windows。
以下基本的情況說明:
一,問題描述
error LNK2001: unresolved external symbol _WinMain@16
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;
二,產生這個問題可能的原因
1, 你用vc建了一個控制台程序,它的入口函數應該是main, 而你使用了WinMain.
2. 你用vc打開了一個.c/.cpp 文件,然后直接編譯這個文件,這個文件中使用了WinMian而不是main作為入口函數。vc這時的默認設置是針對控制台程序的。
三, 解決方法
1.進入project->setting->c/c++, 在category中選擇preprocessor,在processor definitions中刪除_CONSOLE, 添加_WINDOWS
2.進入project->setting->Link, 在Project options中將 /subsystem:console改為/subsystem:windows.
3.保存設置,Rebuild All.
VS2005中的設置請參考對應項進行設置
四,VS2005中的設置
1.菜單中選擇 Project->Properties, 彈出Property Pages窗口
2.在左邊欄中依次選擇:Configuration Properties->C/C++->Preprocessor,然后在右邊欄的Preprocessor Definitions對應的項中刪除_CONSOLE, 添加_WINDOWS.
3.在左邊欄中依次選擇:Configuration Properties->Linker->System,然后在右邊欄的SubSystem對應的項改為Windows(/SUBSYSTEM:WINDOWS)
4.Rebuild All. Ok ?
測試:(環境:vs2005,編程語言vc)
1.用文本編輯器編寫如下代碼:
// test.c #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello!", "title", MB_OK); }
假設把文件包存為test.c.
2.用vs2005建一個Win32 Console Application, 注意在Application Settings設置為Empty project. 然后把test.c添加到工程中去。
3.vs2005 建立的工程默認是支持UNICODE的,我不用這個,所以在菜單中選擇 Project->Properties, 彈出Property Pages窗口。在左邊欄中依次選擇:Configuration Properties->General,然后把右邊欄的Character Set 改為Use Multi-Byte Character Set.
4.編譯,出現如下錯誤:
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup C:\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
5.按照上述VS2005中的設置方法進行設置,然后再編譯,錯誤消失了吧!
同理,如果你新建的是一個Windows 32程序,但是卻使用了控制台程序的入口函數:void main(){ }。可按照下圖所示對應修改程序類型。