2012-07-29 2 views
0

У меня есть заголовочный файл с именем NetworkInterfaceInfoProvider.h. в этом файле заголовка я объявить класс следующим образом:неразрешенный внешний символ при использовании библиотеки

#ifndef INETWORK_INTERFACE_INFO_PROVIDER_H 
#define INETWORK_INTERFACE_INFO_PROVIDER_H 
#pragma once 
/*#include "stdafx.h"*/ 
#include "IConfig.h" 
#include "NetworkAddapterAddresses.h" 
#include "InstaledAddapters.h" 

namespace IRNetwork 
{ 
    class CLASS_DECLSPEC INet; 
    struct CLASS_DECLSPEC GenericIPAddress; 
    /* 
    * provide information about all network interface related adapters such as installed interfaces , addresses , best routes and ... 
    * TO DO: implement Other OS's 
    */ 
    class CLASS_DECLSPEC INetworkInterfaceInfoProvider 
    { 
    public: 
     INetworkInterfaceInfoProvider(void); 
     ~INetworkInterfaceInfoProvider(void); 

     int32_t GetBestRouteTo(char* destIp,uint16_t port,ip_t *ip); 
     int32_t GetBestRouteTo(GenericIPAddress* ip); 
    private: 
     INet* snet; 
    }; 
} 
#endif 

, когда я хочу использовать его в моем консольном приложении я получил следующее сообщение об ошибке компоновщика

* примечание: библиотека выше кода была связана к моему консольному приложению. CLASS_DECLSPEC является определение длл импорт/экспорт *

ошибка LNK2019: неразрешенный внешний символ «__declspec (DllImport) общественности: INT __thiscall IRNetwork :: INetworkInterfaceInfoProvider :: GetBestRouteTo (символ , неподписанные короткий, символ () [65])»(_ имп? GetBestRouteTo @ INetworkInterfaceInfoProvider @ IRNetwork @@ QAEHPADGPAY0EB @ D @ Z) ссылки в функции "недействительным __cdecl test_adapters (пустоты)" (? test_adapters @@ YAXXZ) testDhcpv4.obj testDhcpv4

Что здесь не так?

ответ

1

Хм. Из ошибки я бы сказал, что импорт выглядит хорошо. Возможно, при экспорте произошла ошибка. Предполагая, что вы используете Visual Studio, вы можете использовать DUMPBIN, чтобы проверить, если ваш длл правильно экспорт:

Откройте Visual Studio Command Prompt (доступно из окон меню Пуск) и введите

dumpbin /EXPORTS yourlib.dll 

Тогда вы должны увидеть наш экспорт, что-то вроде (дамп от одного из моих DLLs):

... 
170 A9 00108120 [email protected]@[email protected]@@[email protected] = [email protected]@[email protected]@@[email protected] (public: virtual __thiscall megamol::core::param::BoolParam::~BoolParam(void)) 
... 

Если функция вашей вызываете нет в списке, вы должны перепроверить, если ваш dllexport установлен правильно при построении библиотеки DLL.

Если функция указана, но выглядит по-другому, вы должны проверить, чтобы соглашения о вызовах были одинаковыми для вашего приложения и вашей DLL.

Если функция указана и имя выглядит так, как указано в сообщении об ошибке, выполните двойную проверку, если вы правильно связываете библиотеку импорта DLL.

Также проверьте, является ли конфигурация времени выполнения одинаковой для вашего приложения и вашей DLL (например, Multi-Threaded-Dll или Multi-Threaded-Debug-Dll).

+0

это то, что файл дампа говорит 197 C4 0000B120 GetBestRouteTo @ INetworkInterfaceInfoProvider @ IRNetwork @@ QAEHPADGW4SocketTypeEnum @ 2 @ PAY0EB @ D @ Z = GetBestRouteTo @ INetworkInterfaceInfoProvider @ IRNetwork @@ QAEHPADGW4SocketTypeEnum @ 2 @ PAY0EB @ D @ Z (публичный?: int __thiscall IRNetwork :: INetworkInterfaceInfoProvider :: GetBestRouteTo (char *, unsigned short, enum IRNetwork :: SocketTypeEnum, char (*) [65])) его истинная база в моем синтаксисе для объявления функции –

+0

как я могу проверить, чтобы увидеть ее правильно или нет? Я добавляю библиотеку моей библиотеки DLL для ввода библиотеки приложений. это достаточно? –

+0

после изменения типа конфигурации в динамической библиотеке ссылок (DLL), все правильно работает –

Смежные вопросы