Visual Studio 2008 error LNK2019 错误解决办法(无法解析的外部符号 _WinMain)
Posted on 2012-04-28 11:05 无忧consume 阅读(2765) 评论(0) 编辑 收藏 举报VS2008 一个不产生窗口的Win32程序,代码如下:
[cpp]
#include <windows.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
return 0;
}
[/cpp]
编译后产生如下错误:
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>E:\work\Windows\Error1\Debug\Error1.exe : fatal error LNK1120: 1 个无法解析的外部命令
Google搜索下,网上有解决方案,可是照着试了之后问题还是没有解决,没有办法,只要自己来找出问题根源。对比了VS2008自动生成的Win32程序后,发现原来是编码在作怪~~~
_tWinMain是WinMain(Win32应用程序入口点的定义)的Unicode形式的定义。用VS2008生成的项目一般都是使用Unicode字符集。但是_tWinMain的定义是在tchar.h头文件中,不包含在windows.h头文件中,因为上述程序并没有包含tchar.h头文件,所以才在链接的过程中出现链接错误。修改后代码如下:
[cpp]
#include <windows.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
return 0;
}
[/cpp]
编译通过~~~~
其实,我们只要将字符集改为:使用多字节编码,再把_tWinMain改为WinMain,这样即使不包含tchar.h头文件也可以编译通过!
附网上其他解决方案:
一,问题描述
MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令
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 ?