C++ .dll 在 Visual Studio 中添加 - 另一个 "unresolved external symbol"

标签 c++ dll visual-studio-2013

我正在将 .dll 添加到 C++ 项目。 IDE:Visual Studio 2013

我做了什么:

  • 将带有 header 的目录添加到 VC++ Directories -> Include Directories

.没关系,我可以包含标题,IntellySense 可以看到名称 在这些文件中。

  • 将 .lib 文件添加到 Additional Dependencies 部分及其路径 VC++ Directories -> Library DirectoriesLinker -> General -> Additional Library Directories 中的文件。

  • 将实际的 .dll 文件放置到 DEBUG 文件夹(也放置到项目文件夹,只是 可以肯定)

  • 使用 dumpbin.exe 确保我已经导出了我的所有需要​​的类 .dll

而且我仍然得到一堆未解析的外部对象,其函数存储在该 .dll 中。有什么建议吗?

我找到了这个 question并将 Use library Dependency Inputs 设置为 Yes。仍然没有运气。

更多信息: 错误示例:

Error   2   error LNK2019: unresolved external symbol "__declspec(dllimport) public: double __thiscall Fem::Node::GetX(void)" (__imp_?GetX@Node@Fem@@QAENXZ) referenced in... 

dumpbin 输出中的这个函数:

 172   AB 000F81A0 ?GetX@Node@Fem@@QEAANXZ

我看到名称的最后部分有些不同。不知何故,正如我在评论中提到的,我让它在带有 Visual Studio 编译器的 Qt 项目中工作。

最佳答案

这通常不是一个好主意,因为它不会产生可重用的库。如果不重建 DLL,则无法使用新的编译器甚至新的编译设置重建应用程序。只静态编译您使用的类会更安全。也就是说,如果与延迟加载结合使用会有一些好处,所以...

为了在 DLL 中存储类实现,在构建 DLL 时,您必须在类上使用 __declspec(dllexport),并且在使用它时必须有 __declspec(dllimport) 。导入库具有将自由函数引用转发到 DLL 的垫片,但这些垫片不适用于类和类成员。

通常使用宏来完成dllexportdllimport之间的切换。


既然您已经显示了经过修饰的名称,区别就变得很明显了,并且 demangling 提供了问题出处的线索。

链接器正在寻找

public: double __thiscall Fem::Node::GetX(void)

但是DLL正在导出

public: double __cdecl Fem::Node::GetX(void) __ptr64

注意调用约定是不同的;如果已链接,您将在尝试调用此函数时立即崩溃。

您不能使用来自 DLL 的导出,这些 DLL 具有来自以不同方式编译的应用程序的 C++ 签名。您是否在混合架构(x86 与 x86_64 与 ARM)?也不能这样做,甚至不能使用高度兼容的 C 调用签名。

关于C++ .dll 在 Visual Studio 中添加 - 另一个 "unresolved external symbol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28128519/

相关文章:

c++ - 在构造函数和析构函数中打印值

c# - 制作 Fortran dll 并从 C# 调用它

node.js - Visual Studio 2013 可以在 Node Js Web 应用程序中调试客户端 JavaScript

c++ - typedef 同义替换

c++ - 从 c 调用 swift

c++ - 调试器忽略动态加载的 DLL 中的错误

wpf - 如何获取Visual Studio 2013 Express的Blend

c# - 通过本地路径而不是 TFS 路径在源代码管理资源管理器中导航

c++ - LLVM中如何获取GetElementInst、AllocaInst或LoadInst的左值?

dll - MSVC dll、静态库和导入库的正确命名约定是什么