2008年5月9日 星期五

[轉貼]error LNK2001: 無法解析的外部符號

好多初學者在用DX SDK寫自己的應用時,都莫名其妙的發現如下幾個類似的編譯(更準確地說是鏈接)錯誤:

FDraw.obj : error LNK2001: 無法解析的外部符號 _IID_IDirectDraw7
FDraw.obj : error LNK2019: 無法解析的外部符號 _DirectDrawCreate@12 ,該符號在函數 "int __cdecl DDInitialize(void)" (?DDInitialize@@YAHXZ) 中被引用
FInput.obj : error LNK2001: 無法解析的外部符號 _GUID_SysKeyboard
FInput.obj : error LNK2001: 無法解析的外部符號 _IID_IDirectInput8A
LIBCD.lib(wincrt0.obj) : error LNK2019: 無法解析的外部符號 _WinMain@16 ,該符號在函數 _WinMainCRTStartup 中被引用
dinput8.lib(dilib1.obj) : error LNK2001: 無法解析的外部符號 _GUID_ZAxis
dinput8.lib(dilib1.obj) : error LNK2001: 無法解析的外部符號 _GUID_YAxis
dinput8.lib(dilib1.obj) : error LNK2001: 無法解析的外部符號 _GUID_XAxis
dinput8.lib(dilib2.obj) : error LNK2001: 無法解析的外部符號 _GUID_Key
Debug/sword.exe : fatal error LNK1120: 9 個無法解析的外部命令

而且這種問題是很奇怪的;不過其實並不很複雜。

首先,你大概知道,在使用DX SDK之前,應該在選項裡面,把lib和include設置好,不過這並不代表你的代碼在編譯的時候會自動應用*.lib(比如說ddraw.lib),你需要在你的DX封裝的cpp對應的header裡加上類似的如下幾句:

#pragma once
#pragma message("FDraw.h --> Linking with ddraw.lib")
#pragma comment(lib,"ddraw.lib")

這幾行文字就相當於告訴編譯器編譯的時候把 ddraw.lib 中有用的部分(?)也編進去。

試試看,加上相應的幾句,是不是沒有什麼 error LNK2001 了?