【问题标题】:C++ DLL-Linking UnResolved ExternalsC++ DLL-Linking UnResolved Externals
【发布时间】:2011-02-09 02:37:05
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 你能告诉我们确切的错误,最好是一些相应的代码吗?
  • 我添加了一个基本类示例,错误代码几乎相同: 5>MyFile.obj : error LNK2001: unresolved external symbol "private: static unsigned char MyClass::m_someVar" (?m_someVare @MyClass@@0EA)(用上面的例子修正)

标签: c++ dllexport


【解决方案1】:

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

解决方案很简单。不是手动__declspecing,而是根据您是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

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

class EXPORT MyClass
{
    public:
        static bool m_someVar;
}

【讨论】:

    【解决方案2】:

    使用您的 sn-p 并在 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
    

    这可能会有一些副作用:)

    【讨论】:

    • 不太确定我是否遵循,我项目中使用的宏基本上是 SOME_DLL_EXPORT __declspec(dllexport)
    • @Undawned:不,它是目标项目中使用的宏。在其中一个头文件中查找“#define bool unsigned char”。那个宏搞砸了你的类声明。
    【解决方案3】:

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

    bool MyClass::m_someVar = false;
    

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2013-03-31
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多