LNK2001:尝试从另一个 DLL 调用对象的方法时,未解析的外部符号
LNK2001: unresolved external symbol, when trying to call method of object from another DLL
我有两个模块,每个模块都有自己的类和自己的对象。每个模块都编译为一个 DLL。我想进行"跨DLL"方法调用,具有指向另一个类对象的指针,但链接器不允许这样做(MSVC++ 2008)。
更具体地说:
- 有 calledModule.cpp,它调用了 Class,以及这个类的对象(calledObject);类有 calledMethod,我想调用它;模块被编译为 DLL 并成为(令人惊讶!)调用 Lib.dll。
- 有callingModule.cpp,它有callingClass;除此之外,类有属性,它是指向calledObject的指针;模块被编译为DLL callingLib.dll;calledObject上的指针在构造函数中设置。
我能够编译整个代码。当链接器启动时,麻烦就来了。我得到以下信息:moduleCalling.obj : 错误 LNK2001: 未解析的外部符号 "public: void __thiscall classCalled::methodCall ..."
我不使用任何 declspec 的东西,所以没有从 calledLib.dll 导出任何内容。
我调用的方法(methodCalled)存在于实现中,它的原型在标头中正确声明。classCall 是一个"基本"类,不继承自任何内容。此外,整个项目编译并正常工作,当我声明方法调用为虚拟...
我很难理解,为什么我不能从另一个DLL以"正常"方式调用对象的方法?为什么将其声明为"虚拟"会有所帮助?有人知道吗?我有一些猜测,但专家的回答将有助于理解这些东西。
PS:我正在使用MSVC++ 2008。
谢谢!
更新:添加代码片段,以反映代码的外观。
// 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 中。因此,您必须链接到称为Lib.dll的东西。这称为导入库。它的名字应该叫Lib.lib。为了生成它,您应该编写一个 .def 文件,但对于类方法来说很难,因为链接器使用的类方法名称看起来与它们在C++代码中的外观大不相同。或者您可以使用 declspecs。它将生成正确的 calledLib.lib,您必须将其与您的 callingLib.dll 链接。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 在C++中使用内联方法时出现未定义的符号错误
- 寻找一种更好的方法来表示无符号字符数组
- 在 std::vector<无符号字符中存储任意数据的方法>
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 仅在少数方法(静态或共享库)中解析的外部符号
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 有没有一种预处理器的方法可以从调试符号中删除代码段
- 计算机使用什么方法添加无符号整数
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 为C++字符串中的特殊符号 (") 赋予文字含义的有效C++方法
- 在 C++/CLI 中从本机转换为管理无符号短的最快方法
- 为大无符号整数分配内存的有效方法
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 在 cpp 正文中声明方法时未定义的符号
- 如果未使用方法本身,则忽略方法中的未定义符号
- 标准::字符串::空的未定义符号错误;Mac OS High Sierra 上的 c++ 标准方法链接错误