【问题标题】:C++ DLL: Inheritance and usage of a class defined in a static libraryC++ DLL:静态库中定义的类的继承和使用
【发布时间】:2013-07-08 16:55:26
【问题描述】:

我正在尝试构建一个 DLL,它实现了一个预编译静态库中的类所固有的类。

两个项目都有一个共享的头文件,其中声明了第一个类 (GroovyClass.h):

class GroovyClass
{
public:
    GroovyClass();
    virtual ~GroovyClass();
}

在静态库中定义和实现这个类(GroovyClass.cpp)并编译(我们将结果称为GroovyClass.lib)。

在共享库/DLL 中,这个类被继承如下:

#include "GroovyClass.h"

class MassiveFail : GroovyClass
{
public:
    MassiveFail();
    virtual ~MassiveFail();
}

这可以编译,但在链接阶段我收到有关 GroovyClass 构造函数和析构函数的未解析符号的错误。我像往常一样与 GroovyClass.lib 链接,所以我不明白为什么它找不到符号。

我是否需要以某种特殊方式声明 GroovyClass,然后才能在我的 DLL 项目中使用/继承它?

【问题讨论】:

  • 尝试使用公共继承。类 MassiveFail : 公共 GroovyClass
  • @manuell 刚试过,还是一样的 unresolved symbol 错误。 '未解析的外部符号 "public: __cdecl GroovyClass::GroovyClass....'
  • 发布 full 错误消息(包括损坏的名称)并运行 dumpbin /SYMBOLS xxx.lib 以查看 lib 中定义的符号。
  • @MartinBa @manuell 我发现了问题,一直都是我自己的错。我使用的构建系统 (bam) 在构建 .lib.dll 时使用了不同的“输入表”。所以对于bam的未来用户和搜索优化; 在构建 DLL 时,使用settings.dll 而不是settings.link
  • @andsve - 您应该将此评论添加为该问题的单独答案。 (因为毕竟它回答了问题)

标签: c++ visual-c++ dll static-linking build-tools


【解决方案1】:

您能否打开 Visual Studio 命令提示符并运行 DumpBin 和/或 Lib 以查看 GroovyClass.lib 中的内容?确保例如GroovyClass::GroovyClass 就在里面。

【讨论】:

  • 嗯,奇怪,当我在 GroovyClass.lib 上运行 dumpbin /EXPORTS 时没有导出任何符号。
  • @andsve - lib 不需要导出符号才能使用。 lib 或多或少是obj 文件的集合。
  • 使用 /SYMBOLS 选项运行 dumpbin
【解决方案2】:

代码和实现从一开始就是正确的!

实际问题及解决方案: 我使用的构建系统 (bam) 在构建静态库和共享库时使用了不同的“输入表”。

所以对于 bam 的未来用户而言;如果您正在构建和链接 DLL,请使用表 settings.dll 而不是 settings.link

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多