c++ - 在 DLL 中导出静态数据

标签 c++ windows linker-errors dllexport

我有一个 DLL,其中包含一个带有静态成员的类。我使用 __declspec(dllexport) 来利用这个类的 methods。但是当我将它链接到另一个项目并尝试编译它时,我得到静态数据的“未解析的外部符号”错误。

例如 在 DLL 中,Test.h

class __declspec(dllexport) Test{
protected:
    static int d;
public:
    static void m(){int x = a;}
}

在 DLL 中,Test.cpp

#include "Test.h"

int Test::d;

在使用 Test 的应用程序中,我调用 m()。

我还尝试对每个方法分别使用 __declspec(dllexport),但静态成员仍然出现相同的链接错误。

如果我使用 dumpbin 检查 DLL(.lib),我可以看到符号已被导出。

例如,应用程序在链接时给出以下错误:

1>Main.obj : error LNK2001: unresolved external symbol "protected: static int CalcEngine::i_MatrixRow" (?i_MatrixRow@CalcEngine@@1HA)

但是.lib的dumpbin包含:

Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 4BA3611A Fri Mar 19 17:03:46 2010
  SizeOfData   : 0000002C
  DLL name     : CalcEngine.dll
  Symbol name  : ?i_MatrixRow@CalcEngine@@1HA (protected: static int CalcEngine::i_MatrixRow)
  Type         : data
  Name type    : name
  Hint         : 31
  Name         : ?i_MatrixRow@CalcEngine@@1HA

我不知道如何解决这个问题。我究竟做错了什么?我该如何克服这些错误?

附:该代码最初是为 Linux 开发的,.so/binary 组合可以正常工作

编辑:在给定的情况下,应用程序不直接引用静态变量,但该方法是内联的,因为它位于 header 中。我能够通过将方法移动到 .cpp 文件来解决链接错误。

最佳答案

this cprogramming.com 的线程建议静态变量是 dll 的本地变量,而不是导出的。

下面的讨论摘要

调用应用程序中的代码不能直接访问静态成员,只能通过dll中类的成员函数访问。然而,有几个 inline 函数访问静态成员。这些函数将被内联扩展到调用应用程序代码中,使调用应用程序直接访问静态成员。这将违反上面提到的发现,即静态变量是 dll 的本地变量,并且不能从调用应用程序中引用。

关于c++ - 在 DLL 中导出静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479784/

相关文章:

c++ - 为什么要这样声明宏?

java - 用 Java 创建的线程在 Windows 和 Linux 上的行为是否不同?

Ruby Windows 命令提示符前几行

iphone - 架构i386的 undefined symbol :“_ OBJC_CLASS _ $ _ GDataDateTime”,引用自:

c++ - VS2013 Unresolved External with 构造函数和析构函数

c++ - 处理项目集合的设计问题时出错

c++ - 如何在不将其用作行尾的情况下将 "\"输出到文件

c++ - 在 C++ 中返回运行时可用虚拟内存的大小

c++ - 如何避免链接器错误

c++ - 标准容器的类型特征?