函数指针分配在创建 DLL 后导致错误

Function pointer assignment cause error after creating DLL

本文关键字:错误 DLL 创建 指针 分配 函数      更新时间:2023-10-16

我为我的应用程序编写了一个类。 在此类中,有用于通过网络套接字进行通信的静态函数指针。 在启动时,我将这个函数指针分配给类外的函数,并且可以正常工作,没有任何问题。 现在我从我的类创建了 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);
}
}

(来源,"我的班级.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);
}

(主要,"主要.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)

该错误指示函数需要位于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;
}
相关文章: