LNK2019问题

Posted

技术标签:

【中文标题】LNK2019问题【英文标题】:LNK2019 problem 【发布时间】:2009-11-19 14:02:58 【问题描述】:

尝试在我的项目中使用某些 DLL 时遇到LNK2019 问题。

详情:

    我有一个名为 dll1 的 DLL 项目;编译得很好(使用__declspec(dllexport)),以便导出dll1中的类(供dll2使用)。 我有另一个使用 dll1 功能的 DLL 项目 dll2。我在项目属性的链接器输入中指定了 *.dll1.lib 文件路径,并引用了 dll1 *.h 文件。在这一点上,一切都需要正常工作。 (我认为..) 编译 dll2 时,我收到 LNK2019 错误,告诉我找不到 dll1 中引用的某些方法。 (dll1中的这个方法是静态方法。)

为什么会出现这个错误?

【问题讨论】:

你在静态方法中使用了任何静态变量吗? 作为一个想法。 ii 可能对使用 Depends 有用。运行它,打开你的 dll1,检查“View/Undecorated C++ Funcitons”,在函数和方法列表中找到你的函数并检查它是否有完全相同数量的 args 并且它在正确的命名空间中。 【参考方案1】:

MSDN page about LNK2019 已经提供了大量示例为什么会发生此错误。为了追查到底发生了什么,我建议这样做:

    在链接器抱怨的符号上运行 undname 以解开名称(有关如何运行 undname 的示例,请参阅 Viewing Decorated Names)。 运行dumpbin /EXPORTS(或使用图形Dependency Walker)获取DLL1导出的所有符号的列表。

所以现在您有了链接器试图查找的符号的解组名称,并且您有了 DLL1 导出的符号列表。链接器告诉您它在列表中找不到请求的符号。以下是关于正在发生的事情的两个想法:

    您会看到 DLL1 在其导出列表中具有去错符号,但不完全是链接器所抱怨的错位名称。当您导出的函数几乎与链接器期望的相同时,可能会发生这种情况。可能是您在某处缺少“const”,或者调用约定不同。 您会看到 DLL1 没有导出任何看起来像链接器期望的符号。这表明 DLL1 的声明中缺少一些 __declspec(dllexport)

【讨论】:

当目标库是 LIB 而不是 DLL 时,是否可以做类似的事情? Dumpbin 无法在静态库上运行,当我尝试在我的依赖 walker 上运行时,我收到“无签名”错误。【参考方案2】:

对于常规静态类方法,declspec(dllexport) 应该足够了,但在某些情况下(例如内联友元函数),您需要为函数提供 declspec(dllexport)。

例如

#define DLLEXPORT __declspec(dllexport) 

class DLLEXPORT A 


     A();

     int somefunc();

     DLLEXPORT friend int operator==(const A &ws1, const A &ws2) 
             /* some code */  

;   

【讨论】:

【参考方案3】:

只是猜测:

如果您在 dll2 项目中包含来自 dll1 的标头,并且在该标头中使用 __declspec(dllexport)),则您告诉链接器 dll2 还会导出这些实际上应该由 dll2 导入的类,因此缺少类定义。

所以人们通常会使用这样的定义。

#ifdef DLL1_EXPORTS
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif

class DLLEXPORT A

    //...

这种结构确保dll1定义在dll1中使用时被导出,并在dll2项目中使用时被导入。您只需要在编译 dll1 时定义宏 DLL1_EXPORTdll1 的项目设置通常是个好地方。

另一种方法是使用 2 个不同的标头,一个用于构建 dll1,另一个用于与 dll1 的库一起使用(没有任何 __declspec(dllexport))。

【讨论】:

【参考方案4】:

我最近遇到了同样的问题。问题是一个方法签名void myMethod(const MyType&);带有一个我已经前向声明为class MyType;的参数;但是,定义是struct MyType;

如https://***.com/a/40738415/71051 中所述,这可能会导致 Visual-C++ 的链接器问题——在我的例子中是 LNK2019。

我花了一段时间才解决这个问题,也许这对将来的某人有帮助。

【讨论】:

以上是关于LNK2019问题的主要内容,如果未能解决你的问题,请参考以下文章

LNK2019问题

QT Creator - LNK2019 和 LNK1120 错误 [重复]

C++学习(四五四)LNK2001 LNK2019区别

LNK2019:从 Windows 到 OSX 的可移植性

C++ LNK1120 和 LNK2019 错误:“未解析的外部符号 WinMain@16”

C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019