2011-09-06 44 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