如何解决此MSVC ++编译错误是什么意思
| 我有这个编译错误,我不明白什么是错的。我的Microsoft Visual Studio项目是Win32项目(不是控制台):1>MSVCRT.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
1>C:\\Users\\Soribo\\Desktop\\C++ Programming\\Visual C++ Programming\\KeyboardHook\\Release\\KeyboardHook.exe : fatal error LNK1120: 1 unresolved externals
编辑:使#include \“ stdafx.h \”作为第一行后,编译错误是:
1>MSVCRT.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
1>C:\\Users\\Soribo\\Desktop\\C++ Programming\\Visual C++ Programming\\KeyboardHook\\Release\\KeyboardHook.exe : fatal error LNK1120: 1 unresolved externals
编辑:嗯,我定义了WinMain函数,不是吗?参见下面的代码:
/*
Application:
*/
#include <windows.h>
#include <cstdlib>
#include \"stdafx.h\"
using namespace std;
static HHOOK keyboardHook;
static HINSTANCE gInstance;
// Functions List //
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK LowLevelKeyboardProc( int nCode,LPARAM lParam );
HHook ActivateKeyboardHook( HookProc hookProc,HINSTANCE hInstance );
bool DeactivateKeyboardHook( HHook keyboardHook );
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
//int WINAPI WinMain( HINSTANCE gInstance,LPSTR lpCmdLine,int nCmdShow )
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = gInstance;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(DKGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = L\"Custom Class\";
wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
// if registration of main class fails
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,L\"Window Registration Failed!\",L\"Error!\",MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,L\"Custom Class\",L\"App Name\",WS_CAPTION|WS_MINIMIZEBOX|WS_VISIBLE|WS_OVERLAPPED|WS_SYSMENU,CW_USEDEFAULT,600,500,NULL,gInstance,NULL);
if(hwnd == NULL)
{
MessageBox(NULL,L\"Window Creation Failed!\",MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg,0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK LowLevelKeyboardProc( int nCode,LPARAM lParam )
{
/*if ( code < 0 )
{
return CallNextHookEx( NULL,code,wParam,lParam );
}*/
switch ( wParam )
{
case WM_KEYDOWN:
{
MessageBox( NULL,L\"Notify\",L\"Key Down\",MB_OK );
}
break;
case WM_KEYUP:
{
MessageBox( NULL,L\"Key Up\",MB_OK );
}
break;
case WM_SYSKEYDOWN:
{
MessageBox( NULL,L\"Sys Key Down\",MB_OK );
}
break;
case WM_SYSKEYUP:
{
MessageBox( NULL,L\"Sys Key Up\",MB_OK );
}
break;
default:
{
}
break;
}
return CallNextHookEx( NULL,nCode,lParam );
}
LRESULT CALLBACK WndProc(HWND hwnd,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
keyboardHook = ActivateKeyboardHook( &LowLevelKeyboardProc,gInstance );
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
default:
break;
}
}
break;
case WM_CLOSE:
{
DeactivateKeyboardHook( keyboardHook );
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc(hwnd,msg,lParam);
}
HHOOK ActivateKeyboardHook( HookProc hookProc,HINSTANCE hInstance )
{
return SetWindowsHookEx( WH_KEYBOARD_LL,hookProc,hInstance,0 );
}
bool DeactivateKeyboardHook( HHook keyboardHook )
{
return UnhookWindowsHookEx( keyboardHook );
}
解决方法
这不是编译错误,也不是链接程序错误,这意味着您的程序未定义
WinMain
函数,该函数是程序的入口点。
确保您的程序具有此功能:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PWSTR pCmdLine,int nCmdShow);
请参阅此MSDN文档:
WinMain:应用程序入口点
#include <windows.h>
#include <cstdlib>
#include \"stdafx.h\"
如果您选择了预编译的头文件,则以上内容是错误的,应在文件开头添加ѭ6。因此,将顺序更改为:
#include \"stdafx.h\" //this should be first line of the program!
#include <windows.h>
#include <cstdlib>
而且我认为您不需要包含<windows.h>
,因为很可能stdafx.h
已经包含了它。一探究竟。
现在为什么要首先包含它?因为顾名思义,预编译头是预编译头。编译器不会每次都编译它。而是,它将其中的所有内容编译一次。如果您不首先包含它,编译器将不知道是否编译它之前包含的文件,因为可能是那些文件已经包含在ѭ6中,因此已经被编译了。请参阅此主题:
在头文件或源文件中包含stdafx.h? (在stackoverflow)
使用预编译的头文件(在MSDN上)
, 这不是编译错误,而是链接错误。基本上,您使用的是在某处声明的函数,但从未在任何转换单元中定义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。