I am getting a linking error:

FirstGame error LNK2001: unresolved external symbol "protected: static class GameEngine * GameEngine::m_pGameEngine" (?m_pGameEngine@GameEngine@@1PAV1@A)

Here is my code, can anyone help me with it

GameEngine.h
Code:
BOOL GameInitialize(HINSTANCE hInstance);
void GameStart(HWND hWindow);
void GameEnd();
void GameActivate(HWND hWindow);
void GameDeactivate(HWND hWindow);
void GamePaint(HDC hDC);
void GameCycle();

class GameEngine
{
protected:
	//Member Variables
	static GameEngine* m_pGameEngine;
	HINSTANCE m_hInstance;
	HWND m_hWindow;
	TCHAR m_szWindowClass[32];
	TCHAR m_szTitle[32];
	WORD m_wIcon, m_wSmallIcon;
	int m_iWidth, m_iHeight;
	int m_iFrameDelay;
	BOOL m_bSleep;

public:
	GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass, LPTSTR szTitle, WORD wIcon, WORD wSmallIcon,int iWidth=640, int iHeight=480);
	virtual ~GameEngine();

	//General Methods
	static GameEngine* GetEngine(){ return m_pGameEngine; };
	BOOL Initialize(int iCmdShow);
	LRESULT HandleEvent(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);

	//Accessor Methods
	HINSTANCE GetInstance(){return m_hInstance;};
	HWND GetWindow(){return m_hWindow;};
	void SetWindow(HWND hWindow){m_hWindow=hWindow;};
	LPTSTR GetTitle(){return m_szTitle;};
	WORD GetIcon(){return m_wIcon;};
	WORD GetSmallIcon() { return m_wSmallIcon;};
	int GetWidth(){ return m_iWidth;};
	int GetHeight(){ return m_iHeight;};
	int GetFrameDelay(){return m_iFrameDelay;};
	void SetFrameRate(int iFrameRate){m_iFrameDelay =1000/iFrameRate;};
	BOOL GetSleep(){return m_bSleep;};
	void SetSleep(BOOL bSleep){m_bSleep=bSleep;};
};

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	MSG msg;
	static int iTickTrigger=0;
	int iTickCount;

	if(GameInitialize(hInstance))
	{
		//Initialize the game engine
		if(!GameEngine::GetEngine()->Initialize(iCmdShow))
			return false;
		//Enter the main message loop
		while(TRUE)
		{
			if(PeekMessage(&msg, NULL, 0,0,PM_REMOVE))
			{
				//Process the message
				if(msg.message==WM_QUIT)
					break;
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				//Make sure the game engine isn't sleeping
				if(!GameEngine::GetEngine()->GetSleep())
				{
					//Check the tick count to see if a game cycle has elapsed
					iTickCount=GetTickCount();
					if(iTickCount> iTickTrigger)
					{
						iTickTrigger=iTickCount+GameEngine::GetEngine()->GetFrameDelay();
						GameCycle();
					}
				}
			}
		}
		return (int)msg.wParam;
	}
	//End the game
	GameEnd();

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWindow,UINT msg, WPARAM wParam, LPARAM lParam)
{
	//Route all windows messages to the game engine
	return GameEngine::GetEngine()->HandleEvent(hWindow,msg,wParam,lParam);
}

GameEngine::GameEngine(HINSTANCE hInstance, LPTSTR szWindowClass, LPTSTR szTitle, WORD wIcon, WORD wSmallIcon, int iWidth, int iHeight)
{
	//Set the member variabled for the game engine
	m_pGameEngine=this;
	m_hInstance=hInstance;
	m_hWindow=NULL;
	if(lstrlen(szWindowClass)>0)
		lstrcpy(m_szWindowClass, szWindowClass);
	if(lstrlen(szTitle)>0)
		lstrcpy(m_szTitle,szTitle);
	m_wIcon=wIcon;
	m_wSmallIcon=wSmallIcon;
	m_iWidth=iWidth;
	m_iHeight=iHeight;
	m_iFrameDelay=50; //20 fps default
	m_bSleep=TRUE;
}

GameEngine::~GameEngine()
{}

BOOL GameEngine::Initialize(int iCmdShow)
{
	WNDCLASSEX wndclass;

	//Create the window class for the main window
	wndclass.cbSize=sizeof(wndclass);
	wndclass.style=CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc=WndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=m_hInstance;
	wndclass.hIcon=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));
	wndclass.hIconSm=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=m_szWindowClass;

	//Register the window class
	if(!RegisterClassEx(&wndclass))
		return false;

	//Calculate the window size and position based upon game size
	int iWindowWidth=m_iWidth + GetSystemMetrics(SM_CXFIXEDFRAME) *2,
		iWindowHeight=m_iHeight+GetSystemMetrics(SM_CYFIXEDFRAME) *2+ GetSystemMetrics(SM_CYCAPTION);
	if(wndclass.lpszMenuName !=NULL)
		iWindowHeight += GetSystemMetrics(SM_CYMENU);
	int iXWindowPos=(GetSystemMetrics(SM_CXSCREEN)-iWindowWidth) / 2,
		iYWindowPos=(GetSystemMetrics(SM_CYSCREEN)-iWindowHeight)/ 2;

	//Create the window
	m_hWindow=CreateWindow(m_szWindowClass,m_szTitle, WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,iXWindowPos,iYWindowPos,iWindowWidth,iWindowHeight,NULL,NULL,m_hInstance,NULL);
	if(!m_hWindow)
		return false;

	//Show and update the window
	ShowWindow(m_hWindow,iCmdShow);
	UpdateWindow(m_hWindow);

	return TRUE;
}

LRESULT GameEngine::HandleEvent(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
	//Route Windows messages to game member functions
	switch(msg)
	{
	case WM_CREATE:
		//Set the game window and start game
		SetWindow(hWindow);
		GameStart(hWindow);
		return 0;
	case WM_ACTIVATE:
		//Activate/deactivate the game and update the Sleep status
		if(wParam != WA_INACTIVE)
		{
			GameActivate(hWindow);
			SetSleep(FALSE);
		}
		else
		{
			GameDeactivate(hWindow);
			SetSleep(TRUE);
		}
		return 0;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC=BeginPaint(hWindow,&ps);
		
		//paint the game
		GamePaint(hDC);
		EndPaint(hWindow,&ps);
		return 0;
	case WM_DESTROY:
		//End the game and exit the application
		GameEnd();
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWindow,msg,wParam,lParam);
}
FirstGame.cpp
Code:
#include "FirstGame.h"

BOOL GameInitialize(HINSTANCE hInstance)
{
	//Create the game engine
	_pGame=new GameEngine(hInstance,TEXT("First Game"),TEXT("First Game"),IDI_ICON,IDI_ICON);
	if(_pGame==NULL)
		return false;
	
	//Set the frame rate
	_pGame->SetFrameRate(15);

	return TRUE;
}

void GameStart(HWND hWindow)
{
	//Seed the random number generator
	srand(GetTickCount());
}

void GameEnd()
{
	//Cleanup the game engine
	delete _pGame;
}

void GameActivate(HWND hWindow)
{
	HDC hDC;
	RECT rect;

	//Draw activiation text on game screen
	GetClientRect(hWindow,&rect);
	hDC=GetDC(hWindow);
	DrawText(hDC,TEXT("ACTIVATED!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
	ReleaseDC(hWindow,hDC);
}

void GameDeactivate(HWND hWindow)
{
	HDC hDC;
	RECT rect;

	//Draw deactiviation text on game screen
	GetClientRect(hWindow,&rect);
	hDC=GetDC(hWindow);
	DrawText(hDC,TEXT("DEACTIVATED!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
	ReleaseDC(hWindow,hDC);
}

void GamePaint(HDC hDC)
{}

void GameCycle()
{
	HDC hDC;
	HWND hWindow = _pGame->GetWindow();

	//Draw the skeleton icon at random positions on the game screen
	hDC=GetDC(hWindow);
	DrawIcon(hDC, rand() % _pGame->GetWidth(), rand() % _pGame->GetHeight(),(HICON)(WORD)GetClassLong(hWindow,GCL_HICON));
	ReleaseDC(hWindow,hDC);
}
FirstGame.h
Code:
#pragma once

#include <windows.h>
#include "resource.h"
#include "GameEngine.h"

GameEngine* _pGame;