C ++ DLL链接UnResolved Externals

时间:2010-04-17 08:27:30

标签: c++ dllexport

我正在使用一个相当大的Core项目,我正在尝试使用我已经构建的DLL引擎,我遇到了一堆错误:

未解析的外部符号“private:static class

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

这是一个相当大的项目,我无法完全绕过去除我看到的所有静态类成员,无论如何都有这种事情吗?

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

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

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

3 个答案:

答案 0 :(得分:7)

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

解决方案很简单。而不是手动__declspec,而是根据您是Core还是DLL来创建宏:

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

EXPORTCore中的函数使用IMPORT作为外部DLL中的函数:

class EXPORT MyClass
{
    public:
        static bool m_someVar;
}

答案 1 :(得分: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

这可能会产生一些副作用:)

答案 2 :(得分:0)

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

bool MyClass::m_someVar = false;