【问题标题】:Unresolved external symbol linker error in Visual Studio 2015Visual Studio 2015 中未解决的外部符号链接器错误
【发布时间】:2016-07-09 07:42:41
【问题描述】:

我对 Visual Studio 并不陌生,我知道对此有很多问题。但我真的无法弄清楚这一点。这是错误:

1>moc_displaycounter.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Counter::staticMetaObject" (?staticMetaObject@Counter@@2UQMetaObject@@B)
1>moc_displaymanometer.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const ManoMeter::staticMetaObject" (?staticMetaObject@ManoMeter@@2UQMetaObject@@B)
1>moc_displaysvgmeter.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const SVGMeter::staticMetaObject" (?staticMetaObject@SVGMeter@@2UQMetaObject@@B)

所以我在导入库上做了一个 dumpbin /EXPORTS,它返回了这个:

Microsoft (R) COFF/PE Dumper Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file analogwidgets.lib

File Type: LIBRARY

     Exports

       ordinal    name

                  ??0AbstractMeter@@QEAA@PEAVQWidget@@@Z (public: __cdecl AbstractMeter::AbstractMeter(class QWidget *))
                  ?staticMetaObject@Counter@@2UQMetaObject@@B (public: static struct QMetaObject const Counter::staticMetaObject)
                  ?staticMetaObject@Item@@2UQMetaObject@@B (public: static struct QMetaObject const Item::staticMetaObject)
                  ?staticMetaObject@Led@@2UQMetaObject@@B (public: static struct QMetaObject const Led::staticMetaObject)
                  ?staticMetaObject@ManoMeter@@2UQMetaObject@@B (public: static struct QMetaObject const ManoMeter::staticMetaObject)
                  ?staticMetaObject@PotentioMeter@@2UQMetaObject@@B (public: static struct QMetaObject const PotentioMeter::staticMetaObject)
                  ?staticMetaObject@SVGMeter@@2UQMetaObject@@B (public: static struct QMetaObject const SVGMeter::staticMetaObject)

我检查了导入库上的确切签名。作为一个很好的衡量标准,我使用 depends 来检查这些符号是否在 DLL 中(是的,我知道它在链接过程中不起作用,只是为了确保导入库不是坏了),但它仍然不会链接。尝试调试和发布 x64 版本均未成功。以前用其他版本的VS都没有问题。

对我接下来应该做什么有什么想法吗?

【问题讨论】:

  • 您好像忘记定义一些静态类变量了。
  • 当您声明某些东西但忘记定义它时,会发生未解决的外部符号错误。可以是成员函数或静态变量。

标签: c++ visual-studio visual-studio-2015 linker


【解决方案1】:

从 DLL 导出静态数据有点棘手。链接器错误说明了您忘记执行的操作,在客户端代码中使用这些类时未声明 __declspec(dllimport)。复制代码:

Header.h:

#ifdef _USRDLL
#define EXPORTED __declspec(dllexport)
#else
#define EXPORTED //__declspec(dllimport)       // <=== Problem here!
#endif

struct EXPORTED QMetaObject {
public:
    int foo;
};

class EXPORTED Counter {
public:
    static const QMetaObject staticMetaObject;
};

来源.cpp:

#include "header.h"
const QMetaObject Counter::staticMetaObject;

客户端.cpp:

#include "Header.h"

int main()
{
    auto foo = Counter::staticMetaObject.foo;
    return 0;
}

链接器错误:

ConsoleApplication1.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Counter::staticMetaObject" (?staticMetaObject@Counter@@2UQMetaObject@@B)

删除 Header.h 中的 // 注释以修复,编译器现在知道如何正确使用指向 DLL 数据的指针。请注意原始链接器错误如何告诉您有关此问题的信息。如果您现在在库上运行 Dumpbin.exe /exports,您可以看到导出的成员名称更改为 __imp_?staticMetaObject@Counter@@2UQMetaObject@@B。这是指向数据的指针。需要一个指针,因为如果 DLL 无法在其首选基地址加载,数据可能会被重新定位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2015-06-15
    • 1970-01-01
    • 2011-12-07
    • 2017-06-28
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多