2011-09-06 145 views
0

我正在將一箇舊的vC++ 6.0應用程序移植到vs2005中,我收到以下鏈接器錯誤,並花了數天的時間嘗試查找解決方案。來自第三方庫的鏈接器錯誤LNK2019

錯誤LNK2019:解析外部符號_ 小鬼 _CreateAwnService @ 52 在函數引用 「市民:INT __thiscall 的CMainFrame:CreateAsaNetworkServices(無效)」

有一個第三方的C庫用下面的API定義

extern "C" 
{ 
DLLAPI IAwnServ * AWNAPI CreateAwnService(HINSTANCE hInst, 
    const char *pszDId, const char *pszDLoc, 
    AWN_DIQUAL DiQual, AWN_DOQUAL DoQual, int Prio, 
    const char *pszLicStr, const char *pszInfo, 
    AWN_REPEAT Repeat=R_LAST, TIME_T Since=0, 
    BOOL bLogin=FALSE, BOOL bDeb=FALSE); 

DLLAPI IAwnSend * AWNAPI CreateAwnSend(const IAwnSend *pSend = NULL); 
DLLAPI IAwnData * AWNAPI CreateAwnData(const char *pData = NULL, int iLen = 0); 
DLLAPI IAwnHeader * AWNAPI CreateAwnHeader(const IAwnHeader *pHeader = NULL); 
DLLAPI IAwnReference * AWNAPI CreateAwnReference(const IAwnReference *pRef = NULL); 
DLLAPI IAwnFile * AWNAPI CreateAwnFile(const char *pFile = NULL); 
DLLAPI IAwnOrder * AWNAPI CreateAwnOrder(const IAwnOrder *pOrder); 
DLLAPI IAwnVehicle * AWNAPI CreateAwnVehicle(const IAwnVehicle *pVehicle); 

DLLAPI int AWNAPI AwnCmp(const IAwnSend *pSend1, const IAwnSend *pSend2); 

DLLAPI TIME_T AWNAPI AwnGetNetTime(const char *NetTime); 
DLLAPI int AWNAPI AwnSetNetTime(char *NetTime, TIME_T Time); 
DLLAPI TIME_T AWNAPI AwnMakeQueryTime(int MonthsBack); 
DLLAPI struct tm *AWNAPI AwnSplitTime(TIME_T Time); 
DLLAPI TIME_T AWNAPI AwnMakeTime(tm *ptm); 
} 

#endif 

給API的調用如下:

m_pIAwnService = CreateAwnService(AfxGetApp()->m_hInstance, .........) 

我已檢查所有鏈接包括等,我似乎無法找到該錯誤。

任何幫助,非常感謝。

+1

那麼,錯誤是在鏈接器選項。 *它總是*。您可能已經檢查過,但也許您沒有檢查所有內容,或沒有正確檢查。 –

+0

你確定第三方庫鏈接成功嗎? –

+0

@ R.馬丁霍費爾南德斯可以建議一些鏈接器設置來檢查。 – user655261

回答

0

你好像缺少導入庫的DLL,或者鏈接器無法找到它,在鏈接器 - >輸入 - >附加依賴關係

庫路徑可以在鏈接器設置 - >通用 - >其他庫目錄

這可能是頭文件嘗試使用#pragma自動包含lib文件,因此您應該再次檢查鏈接程序是否可以找到該文件。

另一件要檢查的事情是使用依賴walker來查看DLL,並確保你試圖使用的函數真的是@ 52作爲堆棧清理大小。也許編譯器版本之間變量類型的大小已經改變(例如typedef)。

+0

庫在下面鏈接器輸入 – user655261

+0

附加依賴​​設置我檢查了DLL WIL依賴沃克和你是對的_CreateAwnService在48不在52,因爲輸出表明這是如何修復的。 – user655261

+0

@ user655261:如何在dependsany walker中使用DLL函數?這可能是由於TIME_T定義(如果它定義爲time_t)造成的,因爲它在VS2005(IIRC)中從32位變爲64位。 – tinman

0

當您構建應用程序時,是否將DLLAPI宏定義爲__declspec(dllimport)

+0

是其定義如下的#ifdef _BUILD_AWN_DLL_ #定義DLLAPI __declspec(dllexport)的 #別的 #定義DLLAPI __declspec(dllimport的) #ENDIF – user655261

0

如果您爲未命中導入庫爲您的DLL,看看這個MSDN文章:How To Create 32-bit Import Libraries Without .OBJs or Source。 通過這種方式,您可以爲您沒有提供導入庫的第三方DLL提供加載時動態鏈接。

+0

兩個鏈接都不起作用。 – DuKes0mE

+0

@ DuKes0mE - 互聯網網站死去的令人傷心的事情......修正MSDN鏈接,但是,因爲其中一些還活着。這是一件好事。 – SChepurin