使用库时未解析的外部符号

时间:2012-07-29 13:10:48

标签: syntax-error linker-errors

我有一个名为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

这里有什么问题?

1 个答案:

答案 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)。