首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LNK2019问题

LNK2019问题
EN

Stack Overflow用户
提问于 2009-11-19 14:02:58
回答 4查看 3.1K关注 0票数 4

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

详细信息:

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

为什么我会有这个错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-19 14:29:41

关于LNK2019的MSDN页面已经给出了很多为什么会发生这个错误的例子。为了追踪到底发生了什么,我建议这样做:

  1. 在链接器抱怨要拆分名称的符号上运行undname (有关如何运行undname的示例,请参见查看修饰名称 )。
  2. 运行dumpbin /EXPORTS (或使用图形依赖沃克)获取由DLL1导出的所有符号的列表。

现在,您有了链接器要查找的符号的模糊名称,还有由DLL1导出的符号列表。链接器告诉您,它在列表中找不到所请求的符号。这里有两个关于正在发生的事情的想法:

  1. 您可以看到,DLL1的导出列表中有一个被蒙蔽的符号,但并不完全是链接器抱怨的那个损坏的名称。当您导出的函数与链接器所期望的功能几乎相同时,就会发生这种情况。可能是在某个地方缺少了一个“const”,或者调用约定是不同的。
  2. 您可以看到,DLL1并没有导出任何看起来像链接器所期望的符号。这表明在__declspec(dllexport)的声明中缺少了一些DLL1。
票数 3
EN

Stack Overflow用户

发布于 2009-11-19 14:20:08

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

例如:

代码语言:javascript
复制
#define DLLEXPORT __declspec(dllexport) 

class DLLEXPORT A {


     A();

     int somefunc();

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

};   
票数 2
EN

Stack Overflow用户

发布于 2009-11-19 14:41:50

只是猜测:

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

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

代码语言:javascript
复制
#ifdef DLL1_EXPORTS
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif

class DLLEXPORT A
{
    //...

此结构确保在dll1定义在dll1中使用标头时导出,在dll2项目中使用时导入。您只需要在编译dll1时定义宏dll1。dll1的项目设置通常是一个很好的地方。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1763480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档