2012-07-29 62 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是DLL導入/導出定義*

錯誤LNK2019:無法解析的外部符號「__declspec(dllimport的) 市民:INT __thiscall IRNetwork :: INetworkInterfaceInfoProvider :: GetBestRouteTo(焦 ,無符號短,CHAR()[65])」(_ 小鬼?GetBestRouteTo @ INetworkInterfaceInfoProvider @ @@ IRNetwork @ QAEHPADGPAY0EB @ d Z) 在函數引用 「空隙__cdecl test_adapters(無效)」 (?test_adapters @@ YAXXZ)testDhcpv4.obj testDhcpv4

這裏有什麼問題?

回答

1

嗯。從錯誤我會說導入看起來不錯。所以在導出時可能會出錯。假設你正在使用Visual Studio,您可以使用DUMPBIN檢查,如果你的dll是正確出口:

打開Visual Studio命令提示符(可從Windows開始菜單),然後鍵入

dumpbin /EXPORTS yourlib.dll 

那麼你應該看到我們的出口,像(轉儲從我的dll之一):

... 
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(例如多線程Dll或多線程調試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,枚舉IRNetwork :: SocketTypeEnum,char(*)[65])) 它的真正基礎在於我的語法函數聲明 – 2012-07-29 14:34:06

+0

我怎麼能檢查看到它鏈接是否正確? 我添加我的dll庫到控制檯應用程序庫輸入。 這夠了嗎? – 2012-07-29 14:37:50

+0

將配置類型更改爲動態鏈接庫(DLL)後,每件事情都可以正常工作 – 2012-07-29 14:50:42