4

我正在处理一个相当大的Core项目,我正在尝试对其进行调整以使用我构建的 DLL 引擎,我遇到了一堆错误,例如:

未解析的外部符号“私有:静态类

当在 DLL 中包含来自 Core 的一些头文件时,该类通过 __declspec(dllexport) 导出,但任何具有静态成员的头文件都会抛出关于静态成员的大量错误。

这是一个相当大的项目,我不能完全删除我看到的每个静态类成员,这种事情有吗?

正在导入的类的基本示例:

class __declspec(dllexport) MyClass
{
    public:
        static bool m_someVar;
}

为了清楚起见,我只想说明 m_someVar 是在类实现文件中定义/声明的(忘记这个术语)

4

3 回答 3

7

当您编译时,Core您希望这些函数成为dllexport;但是,当您编译 DLL 时,您希望它们是dllimport. 在您的情况下,您总是将它们定义为dllexport,因此当您链接 DLL 时,它会抱怨您已经声明了一个函数(甚至说您会导出它)而没有定义它。

解决方案很简单。与其手动__declspecing,不如根据您是CoreDLL 还是 DLL 创建宏:

#ifndef I_AM_A_DLL
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllimport)
#define IMPORT __declspec(dllexport)
#endif

用于外部 DLL 中EXPORT的函数Core 和函数:IMPORT

class EXPORT MyClass
{
    public:
        static bool m_someVar;
}
于 2010-04-17T21:18:34.640 回答
2

使用您的代码片段并在 DLL 上运行 Dumpbin.exe /exports 会产生以下输出:

1    0 0001107D ??4MyClass@@QAEAAV0@ABV0@@Z = @ILT+120(??4MyClass@@QAEAAV0@ABV0@@Z)
2    1 00017000 ?m_someVar@MyClass@@2_NA = ?m_someVar@MyClass@@2_NA (public: static bool MyClass::m_someVar)

请注意静态成员的导出如何存在,但名称与您的名称略有不同。如果我通过 undname.exe 运行您的导出名称,我会得到:

Undecoration of :- "?m_someVare@MyClass@@0EA"
is :- "private: static unsigned char MyClass::m_someVare"

注意区别。您的目标项目中有一个邪恶的宏。通过将其添加到头文件来解决您的问题:

#undef bool

这可能有一些副作用:)

于 2010-04-17T12:28:02.043 回答
0

也许是一个愚蠢的问题,但你是在某个地方定义它吗?您的定义将类似于:

bool MyClass::m_someVar = false;
于 2010-04-17T09:50:13.783 回答