【问题标题】:Function pointer assignment cause error after creating DLL创建 DLL 后函数指针赋值导致错误
【发布时间】:2020-05-13 05:58:06
【问题描述】:

我为我的应用程序编写了一个类。在这个类中有一个静态函数指针,用于通过网络套接字进行通信。在启动时,我将此函数指针分配给类外的一个函数,并且工作正常,没有任何问题。 现在我从我的类中创建了 DLL,但是当我将此指针分配给我的函数时,我得到了“未解析的外部符号”错误。 如何将类内的静态函数指针分配给类外的函数而没有任何问题?

这是我的课:

(标题,“MyClass.h”)

#define IMPORT_DLL

#ifdef IMPORT_DLL
    #define DLL_IMPORT_EXPORT __declspec(dllimport) 
#else
    #define DLL_IMPORT_EXPORT __declspec(dllexport) 
#endif

namespace nmspace
{
    class MyClass
    {
        //Constructors
        DLL_IMPORT_EXPORT MyClass();
        DLL_IMPORT_EXPORT MyClass(size_t ID);

        //Destructor
        DLL_IMPORT_EXPORT ~MyClass();

        ....

        //This static function pointer should be assigned to a function outside of class
        //this pointer used frequently
        static bool(*Class_Transmit)(uint8_t* TX_buffer, size_t TX_size, size_t Port);
    }
}

(来源,“MyClass.cpp”)

#include "MyClass.h"

bool(*MyClass::Class_Transmit)(uint8_t* TX_buffer, size_t TX_size, size_t Port) = nullptr;

//Constructor
void MyClass::MyClass()
{
    size_t Sock_num = 0
    uint8_t TX_buffer[20] = "Transmit done";
    bool is_connected = false;
    is_connected = Class_Transmit(TX_buffer, 20, Sock_num);
}

(main, "main.cpp")

#include "MyClass.h"

bool MyFunc(uint8_t* TX_buffer, size_t TX_size, size_t Port)
{
    ....
    return true;
}

int main()
{
    HINSTANCE hinstLib;
    hinstLib = LoadLibrary(TEXT("myclass.dll"));

    // If the handle is valid, try to get the function address.
    if (hinstLib != NULL)
        return false;


    //Assign network socket function for "Class_Transmit" class for communication
    MyClass::Class_Transmit = MyFunc;
    return 0;
}
Error LNK2001 unresolved external symbol "public: static bool (__cdecl* 
nmspace::MyClass::Class_Transmit)(unsigned char *,unsigned int,unsigned int)"
 (?Class_Transmit@MyClass@nmspace@@2P6A_NPAEII@ZA)

【问题讨论】:

  • 我收到“无法解析的外部符号”错误。 -- 请发布确切的错误消息。还请发布您提供回调的函数的确切原型。
  • Error LNK2001 unresolved external symbol "public: static bool (__cdecl* nmspace::MyClass::Class_Transmit)(unsigned char *,unsigned int,unsigned int)" (?Class_Transmit@MyClass@nmspace@@ 2P6A_NPAEII@ZA)
  • nmspace::MyClass:: -- 那么这个函数在nmspace 命名空间中吗?此外,您应该使用错误信息更新原始问题,而不是在评论部分。
  • 不,那不会将该函数放入命名空间中。
  • @RodgerBrown 您可能需要添加一些 Visual C++ 标记,因为 DLL 和 __declspec 不是 C++ 语言的一部分。至于链接错误,你可能想将Class_Transmit标记为DLL_IMPORT_EXPORT

标签: c++ class function-pointers


【解决方案1】:

该错误表明该函数需要在nmspace 命名空间中。请尝试以下操作:

namespace nmspace
{
    bool MyFunc(uint8_t* TX_buffer, size_t TX_size, size_t Port)
    {
        return true;
    }
}

完成此操作后,您需要清理其余的声明。以下完整程序编译和链接没有问题:

#include <cstdint>
#include <cstdlib>

namespace nmspace
{
    class MyClass
    {
        public:
            static bool (*Class_Transmit)(uint8_t* TX_buffer, size_t TX_size, size_t Port);
    };
}

bool (*nmspace::MyClass::Class_Transmit)(uint8_t* TX_buffer, size_t TX_size, size_t Port) = nullptr;


namespace nmspace
{
    bool MyFunc(uint8_t* TX_buffer, size_t TX_size, size_t Port)
    {
        return true;
    }
}

int main()
{
    nmspace::MyClass::Class_Transmit = nmspace::MyFunc;
    return 0;
}

【讨论】:

  • 我试过但没用,同样的错误;谢谢你的帮助保罗
  • MyFunc 不必在nmspace 命名空间中,但MyClass 成员绝对必须在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多