我正在将 .dll 添加到 C++ 项目。 IDE:Visual Studio 2013
我做了什么:
- 将带有 header 的目录添加到
VC++ Directories -> Include Directories
.没关系,我可以包含标题,IntellySense 可以看到名称 在这些文件中。
将 .lib 文件添加到
Additional Dependencies
部分及其路径VC++ Directories -> Library Directories
和Linker -> 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 的垫片,但这些垫片不适用于类和类成员。
通常使用宏来完成dllexport
和dllimport
之间的切换。
既然您已经显示了经过修饰的名称,区别就变得很明显了,并且 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/