欢迎您注册加入!这里有您将更精采!
您需要 登录 才可以下载或查看,没有账号?注册
x
用VS编写win32窗口程序编译时提示错误:
错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 D:\VS\Win32\Demo\Demo\MSVCRTD.lib(crtexew.obj)
错误 2 error LNK1120: 1 个无法解析的外部命令 D:\VS\Win32\Demo\Debug\Demo.exe
如下图所示:
_WinMain@16
通过反复调试都没找到原因,最后测试后发现少了一个C语言运行时头文件,从而引起的上面的错误。通常情况下如果出现上面的错误有两种情况:一是c语言运行时找不到适当的程序入口函数;二是入口函数之前全局变量定义出错。具体解决如下:
第一,根据提示先查看入口函数是否有误,一般情况下如果是Windows应用程序,入口函数为WinMain、_tWinMain,在VS新建项目为“Win32项目”;如果是控制台程序,入口函数为main,在VS新建项目为“Win32控制台应用程序”。
[C++] 纯文本查看 复制代码 ……
#define MAX_LOADSTRING 100
//全局变量
HINSTANCE m_hInst; //当前实例
TCHAR szTitle[MAX_LOADSTRING]; //标题栏名称
TCHAR szWindowClass[MAX_LOADSTRING]; //主窗口类名
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
……
}
而本例中入口函数为_tWinMain,应该是正确的,但报错了。那么需要按下面步骤检查:第一、检查自己编写的程序是Windows窗口应用程序,还是控制台程序,并修改对应的属性。这样情况通常是新同学容易出现的错误。
1、如果是Windows窗口应用程序,那么检查 项目(Project) -> 属性(Properties) -> 属性页 -> 配制属性(Configuration Properties) -> C/C++ -> 预处理器(Preprocessor) -> 预处理定义(Preprocessor Definitions) 看有无 _WINDOWS ,如果没有添加上,并确定保存;看有无 _CONSOLE 如果有则删除,并确定保存。如下图所示:
Windows项目配制属性
同时检查 项目(Project) -> 属性(Properties) -> 属性页 -> 配制属性(Configuration Properties) -> 链接器(Linker) -> 系统(System) ->子系统(SubSystem)里是否是 窗口(Windows)(/SUBSYSTEM:WINDOWS),如果不是则改成 窗口(Windows)(/SUBSYSTEM:WINDOWS) 并确定保存。如下图所示:
Windows项目配制属性连接器
2、反之,如果是Windows控制台程序,那么检查 项目(Project) -> 属性(Properties) -> 属性页 -> 配制属性(Configuration Properties) -> C/C++ -> 预处理器(Preprocessor) -> 预处理定义(Preprocessor Definitions) 看有无 _CONSOLE ,如果没有添加上,并确定保存;看有无 _WINDOWS 如果有则删除,并确定保存。同时检查 项目(Project) -> 属性(Properties) -> 属性页 -> 配制属性(Configuration Properties) -> 链接器(Linker) -> 系统(System) ->子系统(SubSystem)里是否是 控制台(CONSOLE)(/SUBSYSTEM:CONSOLE),如果不是则改成 控制台(CONSOLE)(/SUBSYSTEM:CONSOLE) 并确定保存。
第二、如果上面所描述的检查正确后编译还报同样的错误,那么应检查下入口函数前面的全局变量定义中是否包含了C 运行时头文件,如果没包含应该添加上,编译后解决问题。如下图所示:
全局变量的C运行时头文件
|