我有一个名为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) public:int __thiscall IRNetwork :: INetworkInterfaceInfoProvider :: GetBestRouteTo(CHAR ,unsigned short,char()[65])“(_ imp ?GetBestRouteTo @InetworkInterfaceInfoProvider @ IRNetwork @@ QAEHPADGPAY0EB @ D @ Z) 在函数“void __cdecl test_adapters(void)”中引用 (?test_adapters @@ YAXXZ)testDhcpv4.obj testDhcpv4
这里有什么问题?
答案 0 :(得分:1)
嗯。从错误我会说导入看起来不错。因此,导出时可能出错。假设您使用的是Visual Studio,则可以使用dumpbin检查您的dll是否正确导出:
打开Visual Studio命令提示符(可从Windows开始菜单中获得)并键入
dumpbin /EXPORTS yourlib.dll
然后你应该看到我们的导出,例如(从我的一个dll转储):
...
170 A9 00108120 ??1AbstractParam@param@core@megamol@@UAE@XZ = ??1BoolParam@param@core@megamol@@UAE@XZ (public: virtual __thiscall megamol::core::param::BoolParam::~BoolParam(void))
...
如果未列出您正在呼叫的功能,则应该在构建dll时正确设置dllexport时双重检查。
如果列出了该功能,但看起来不同,则应检查您的应用程序和dll的调用约定是否相同。
如果列出了该函数且名称与错误消息所示的名称相同,请仔细检查是否正确链接了dll的导入库。
同时检查应用程序和dll的运行时配置是否相同(例如Multi-Threaded-Dll或Multi-Threaded-Debug-Dll)。