【问题标题】:Constructor / Destructor Linking Error构造函数/析构函数链接错误
【发布时间】:2012-08-17 14:00:36
【问题描述】:

我有一个项目(创建一个 dll),比如 test.dll,我没有在 dll 中导出类的构造函数和析构函数,比如 TestClass。这是因为我有一些工厂函数应该被调用来创建和销毁 TestClass 的对象。这种设计在我创建的独立示例中运行良好,我尝试使用 test.dll 中的 TestClass 对象。

但是,当我将此 test.dll(或在我的情况下为 .lib,因为我使用 Visual Studio)链接到我们生产模块中的项目时,我得到了指向它无法找到的构造函数和析构函数的奇怪链接错误对于测试类。我知道我不会在项目的任何地方调用 new/delete 或创建 TestClass 的任何堆栈实例。生产模块使用 C#/CLR/CLI 以及我认为的 C++。解决问题的唯一方法是为我导出 TestClass 的构造函数和析构函数。这在设计上是不可取的。

有人熟悉这种情况吗?有人能指出可能是什么问题吗?

这是我得到的错误:

Error   5264    error LNK2028: unresolved token (0A000BA3) "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) referenced in function "public: virtual void * __thiscall BE::TestClass::`vector deleting destructor'(unsigned int)" (??_ETestClass@BE@@$$FUAEPAXI@Z)  AMBestDetailBridge.obj  BEBase

Error   5373    error LNK2001: unresolved external symbol "public: virtual __thiscall BE::TestClass::~TestClass(void)" (??1TestClass@BE@@$$FUAE@XZ) AMBestDetailBridge.obj  BEBase

谢谢!

【问题讨论】:

  • 请向我们展示一个显示您的问题的最小示例
  • 您是否曾经创建过该类的堆栈实例?那些也需要构造函数和析构函数。
  • 展示一个例子有点棘手。这是因为当我创建一个简单的应用程序时不会出现问题。我们的系统有一些东西,我只在我们的一个项目中找到它。我知道他们有一些 CLR 代码挂在那里。我试图弄清楚它是否与此有关。我对 CLR 不是很熟悉。
  • 我没有创建堆栈或堆实例。设计本身就是这样,必须使用工厂方法。
  • 您可以暂时将构造函数/析构函数设为私有,并要求您的客户端 DLL 进行编译。如果他们不小心直接/通过基类使用构造函数,那么他们应该会得到一个编译器错误

标签: c# c++ windows visual-studio clr


【解决方案1】:

链接错误说你正在通过delete []调用析构函数,所以很可能在你的生产模块中,你有某些代码:

TestClass* pTest = ...
delete pTest;
TestClass* pTestArray = ...
delete[] pTest;

当然,在智能指针的情况下可能不是那么明显:

SmartPtr<TestClass> spTest = ...
// delete called automatically when out of scope.

在一个模块中分配并在另一个模块中删除将使您面临潜在风险 - 因为这两个模块可能使用不同的堆进行内存分配(例如您重新定义新运算符),幸运的是这个问题在链接时暴露出来,而不是运行时间。

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2015-07-09
    相关资源
    最近更新 更多