Ошибка компоновщика LNK2019 из сторонней библиотеки - PullRequest
0 голосов
/ 06 сентября 2011

Я портирую старое приложение 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, .........)

Я проверил все ссылки, и т. Д., И не могу найти ошибку.

Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2011

Похоже, вам не хватает библиотеки импорта для dll, или компоновщик не может ее найти, в Линкер -> Ввод -> Дополнительные зависимости

Пути к библиотекам можно установить в Линкер -> Общие -> Дополнительные каталоги библиотек

Возможно, что заголовочные файлы пытаются автоматически включить файл lib с помощью #pragma, поэтому вам следует еще раз проверить, что компоновщик может найти файл.

Еще одна вещь, которую нужно проверить, это посмотреть на DLL с помощью средства обхода зависимостей и убедиться, что функция, которую вы пытаетесь использовать, действительно равна @ 52 для размера очистки стека. Возможно, размеры переменных типов изменились между версиями компилятора (например, typedefs).

0 голосов
/ 06 сентября 2011

Если вы действительно пропускаете библиотеку импорта для своей DLL, взгляните на эту статью MSDN: Как создать 32-битные библиотеки импорта без .OBJ или исходного кода .Таким образом, вы можете создать динамическое связывание во время загрузки сторонней DLL, для которой у вас нет библиотеки импорта.

0 голосов
/ 06 сентября 2011

Определен ли макрос DLLAPI для __declspec(dllimport) при создании приложения?

...