我正在将一个旧的vc ++ 6.0应用程序移植到vs2005,我收到以下链接器错误,我花了几天时间试图找到解决方案。
错误LNK2019:未解析的外部符号_ imp _CreateAwnService @ 52 在函数“public: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, .........)
我已检查所有链接包括等,我似乎无法找到错误。
非常感谢任何帮助。
答案 0 :(得分:0)
在构建应用程序时,DLLAPI宏是否定义为__declspec(dllimport)
?
答案 1 :(得分:0)
看起来你错过了dll的导入库,或链接器找不到它,在链接器中 - >输入 - >其他依赖性
可以在Linker中设置库路径 - >一般 - >其他图书馆馆藏
可能是头文件尝试使用#pragma自动包含lib文件,因此您应该再次检查链接器是否可以找到该文件。
要检查的另一件事是使用dependancy walker查看DLL,并确保您尝试使用的函数实际上是@ 52用于堆栈清理大小。也许变量类型的大小在编译器版本之间发生了变化(例如typedef)。
答案 2 :(得分:0)
如果您 错过了DLL的导入库,请查看此MSDN文章:How To Create 32-bit Import Libraries Without .OBJs or Source。 这样,您可以为没有提供导入库的第三方DLL进行加载时动态链接。