[英]What does this MSVC++ compile error mean
我有這個編譯錯誤,我不明白出了什么問題。 我的 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 function 不是嗎? 見下面的代碼:
/*
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, WPARAM wParam, 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, HINSTANCE hPrevInstance, 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, CW_USEDEFAULT, 600, 500,
NULL, NULL, gInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, L"Window Creation Failed!", L"Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, 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"Notify", L"Key Up", MB_OK );
}
break;
case WM_SYSKEYDOWN:
{
MessageBox( NULL, L"Notify", L"Sys Key Down", MB_OK );
}
break;
case WM_SYSKEYUP:
{
MessageBox( NULL, L"Notify", L"Sys Key Up", MB_OK );
}
break;
default:
{
}
break;
}
return CallNextHookEx( NULL, nCode, wParam, lParam );
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, 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, wParam, lParam);
}
HHOOK ActivateKeyboardHook( HookProc hookProc, HINSTANCE hInstance )
{
return SetWindowsHookEx( WH_KEYBOARD_LL, hookProc, hInstance, 0 );
}
bool DeactivateKeyboardHook( HHook keyboardHook )
{
return UnhookWindowsHookEx( keyboardHook );
}
那不是編譯錯誤,是linker錯誤,說明你的程序沒有定義WinMain
function,這是程序的入口點。
確保你的程序有這個 function:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
請參閱此 MSDN 文檔:
#include <windows.h>
#include <cstdlib>
#include "stdafx.h"
如果你選擇了預編譯的 header 文件,那么上面的錯誤, stdafx.h
應該包含在文件的開頭。 因此將順序更改為:
#include "stdafx.h" //this should be first line of the program!
#include <windows.h>
#include <cstdlib>
而且我認為您不需要包含<windows.h>
,因為stdafx.h
很可能已經包含它。 一探究竟。
現在為什么要首先包含它? 因為預編譯的header,顧名思義就是預編譯的header。 編譯器不會每次都編譯它。 相反,它會將其中的所有內容編譯一次。 如果不先包含它,編譯器將不知道是否編譯它之前包含的文件,因為這些文件可能已經包含在stdafx.h
中,因此已經編譯。 請參閱此主題:
這不是編譯錯誤,而是鏈接錯誤。 基本上,您使用的是您在某處聲明但從未在任何翻譯單元中定義的 function。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.