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_EXPORT
。 dll1 的项目设置通常是个好地方。
另一种方法是使用 2 个不同的标头,一个用于构建 dll1,另一个用于与 dll1 的库一起使用(没有任何 __declspec(dllexport)
)。
【讨论】:
【参考方案4】:我最近遇到了同样的问题。问题是一个方法签名void myMethod(const MyType&);
带有一个我已经前向声明为class MyType;
的参数;但是,定义是struct MyType;
。
如https://***.com/a/40738415/71051 中所述,这可能会导致 Visual-C++ 的链接器问题——在我的例子中是 LNK2019。
我花了一段时间才解决这个问题,也许这对将来的某人有帮助。
【讨论】:
以上是关于LNK2019问题的主要内容,如果未能解决你的问题,请参考以下文章
QT Creator - LNK2019 和 LNK1120 错误 [重复]