Visual Studio 2008 error LNK 错误解决办法(无法解析的外部符号 _WinMain) - 无忧consume

时间:2024-04-16 20:44:19

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程序后,发现原来是编码在作怪~~~

image

_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 ?