c++ - LNK2001:未解析的外部符号,当试图从另一个 DLL 调用对象的方法时

标签 c++ visual-c++ dll lnk2001

我有两个模块,每个模块都有自己的类和对象。每个模块都被编译成一个 DLL。我想进行“跨 DLL”方法调用,使指针指向另一个类的对象,但链接器不允许这样做 (MSVC++ 2008)。

更具体地说:

  • 有calledModule.cpp,里面有calledClass,还有这个类的对象(calledObject);类有调用方法,我想调用它;模块被编译为 DLL 并成为(惊喜!)名为 Lib.dll。
  • 有 callingModule.cpp,它有 callingClass;除其他事项外,该类具有属性,该属性是指向被调用对象的指针;模块被编译为DLL callingLib.dll; calledObject 上的指针在构造函数中设置。

我能够编译整个代码。当链接器启动时,麻烦就来了。我得到以下信息: moduleCalling.obj:错误 LNK2001:未解析的外部符号“public:void __thiscall classCalled::methodCalled ...”

我没有使用任何 declspec 东西,所以没有从 calledLib.dll 导出任何东西。

我正在调用的方法 (methodCalled) 存在于实现中,其原型(prototype)在 header 中正确声明。 classCalled 是一个“基本”类,没有继承自任何东西。 此外,当我将 methodCalled 声明为虚拟时,整个项目编译并正常工作......

我很难理解,为什么我不能从另一个 DLL 以“正常”方式调用对象的方法?为什么将其声明为“虚拟”有帮助?有谁知道?我有一些猜测,但专家的回答将有助于理解这些东西。

附言:我使用的是 MSVC++ 2008。

谢谢!

更新:添加代码片段,反射(reflect)代码的外观。

// part of calledLib.dll
// moduleCalled.h

class classCalled {
  public:
    int methodCalled() { return 1 };
};

// ---------------------------------------------------------------
// part of callingLib.dll
// moduleCalling.h

#include "moduleCalled.h"

class classCalling {
  public:
    classCalled* ref;
    void justSomeMethod();
};

// ---------------------
// moduleCalling.cpp

#include "moduleCalling.h"

void classCalling::justSomeMethod() {
  ref = new classCalled();
  int a = ref->methodCalled(); // <--- this is not allowed by linker,
                               // unless methodCalled is made virtual.
}

最佳答案

链接器链接来自不同模块的代码片段。如果您有一个从一个模块到另一个模块的调用,链接器必须知道您正在调用的函数是在哪个其他模块中实现的,并将调用替换为真实地址。这是一张非常粗略的图片,但足以了解正在发生的事情。

在您的情况下,链接器必须知道您的函数位于 calledLib.dll 中。因此,您必须链接到引用 calledLib.dll 的内容。这个东西叫做导入库。它的名字应该叫做Lib.lib。为了生成它,您要么编写一个 .def 文件,但对于类方法来说很难,因为链接器使用的类方法名称看起来与它们在 C++ 代码中的名称非常不同。或者您可以使用 declspecs。它将生成正确的 calledLib.lib,您必须将其与 callingLib.dll 链接。

关于c++ - LNK2001:未解析的外部符号,当试图从另一个 DLL 调用对象的方法时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628945/

相关文章:

java - Linux 系统上的 Windows DLL

ruby - 如何使用 Ruby fiddle 加载 Windows DLL 文件?

c++函数不接受0个参数

c++ - 原始套接字的数据包碎片

c++ - 使用 >> 和 getline 的混合类型

c++ - 如何获取此文件夹中的文件夹列表?

c++ - Unresolved external 错误

Php 向 C++ Windows 应用程序发送命令

c++ - 如何像 java 一样迭代 C++ 中的枚举?

c# - 如何从 C++ 调用 WCF 服务