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

C++ .dll adding in Visual Studio - yet another "unresolved external symbol"

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

我做了什么:

。没关系,我可以包含 headers,IntellySense 看到名字 在这些文件中。

而且我仍然得到一堆未解决的外部问题,其功能存储在该 .dll 中。有什么建议吗?

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

更多信息: 错误示例:

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

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

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

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

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


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

链接器正在寻找

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

但是 DLL 正在导出

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

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

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