gpt4 book ai didi

c++ - 使用 dllexport 和特定函数名称时未解析的外部符号

转载 作者:太空狗 更新时间:2023-10-29 23:46:02 24 4
gpt4 key购买 nike

编辑

为了解决这个问题,我将以下内容添加到头文件(的开头):

#ifdef GetMessage
#undef GetMessage
static inline BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
) {
#if UNICODE
return ::GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#else
return ::GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#endif
}
#endif

我正在使用如下代码创建一个 C++ DLL(使用 Visual Studio 2008):

头文件:

#include <windows.h> // Edit: This is the culprit.
class __declspec(dllexport) TestBaseClass
{
protected:
char m_Message[512];
public:
TestBaseClass();
virtual char* GetMessage(void) = 0;
};

class __declspec(dllexport) TestDerivedClass : public TestBaseClass
{
public:
TestDerivedClass();
virtual char* GetMessage(void);
};

CPP 文件:

TestBaseClass::TestBaseClass()
{
}

TestDerivedClass::TestDerivedClass() : TestBaseClass()
{
}

char* TestDerivedClass::GetMessage(void)
{
sprintf(m_Message, "This is a Message");
return m_Message;
}

当我编译 DLL 时,出现链接器错误:

error LNK2001: unresolved external symbol "public: virtual char * __thiscall TestDerivedClass::GetMessageA(void)" (?GetMessageA@TestDerivedClass@@UAEPADXZ)

如果我将“GetMessage”的每个实例都更改为其他内容(例如“TestFunc”),我不会收到链接器错误。

主要问题:为什么我不能使用“GetMessage”作为我的函数名称?

次要问题:有没有办法解决链接器错误,并按照当前定义在我的类中保留“GetMessage”?

最佳答案

这是由于 Windows header 中的一个怪癖。当你#include <windows.h> , 它 #define符号 GetMessageGetMessageAGetMessageW , 取决于您是否启用了 Unicode 支持(更具体地说,如果定义了 UNICODE 宏)——参见 Unicode in the Windows APIConventions for Function Prototypes了解更多信息。

要解决这个问题,您有几种选择:

  • 不要包含 Windows header
  • 定义宏 NOMSG 在包括之前 <windows.h> -- 这将抑制各种与消息相关的函数和宏的声明
  • #undef GetMessage在你的类定义之前
  • 将您的函数重命名为其他名称

关于c++ - 使用 dllexport 和特定函数名称时未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com