创建DLL后函数指针赋值导致错误
Function pointer assignment cause error after creating DLL
我为我的申请写了一个class。在这个 class 中有一个静态函数指针,用于通过网络套接字进行通信。在启动时,我将此函数指针分配给 class 之外的函数并且工作正常,没有任何问题。
现在我从 class 创建了 DLL,但是当我将此指针分配给我的函数时,出现 "unresolved external symbol" 错误。
我如何可以毫无问题地将 class 内部的静态函数指针分配给 class 外部的函数?
这是我的 class:
(header, "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.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;
}
我为我的申请写了一个class。在这个 class 中有一个静态函数指针,用于通过网络套接字进行通信。在启动时,我将此函数指针分配给 class 之外的函数并且工作正常,没有任何问题。 现在我从 class 创建了 DLL,但是当我将此指针分配给我的函数时,出现 "unresolved external symbol" 错误。 我如何可以毫无问题地将 class 内部的静态函数指针分配给 class 外部的函数?
这是我的 class:
(header, "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.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;
}