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 的目录添加到
VC++ Directories -> Include Directories
。没关系,我可以包含 headers,IntellySense 看到名字
在这些文件中。
已将 .lib 文件添加到 Additional Dependencies
部分和该文件的路径
VC++ Directories -> Library Directories
和 Linker -> General -> Additional Library Directories
.
中的文件
将实际的 .dll 文件放入 DEBUG 文件夹(也放入项目文件夹,只是
可以肯定)
使用 dumpbin.exe
来确定我已经导出所有需要的 类
.dll
而且我仍然得到一堆未解决的外部问题,其功能存储在该 .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 成员。
通常使用宏来完成dllexport
和dllimport
之间的切换。
既然您已经显示了错位的名称,区别就很明显了,并且 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 调用签名。
我正在将 .dll 添加到 C++ 项目。 IDE: Visual Studio 2013
我做了什么:
- 已将包含 headers 的目录添加到
VC++ Directories -> Include Directories
。没关系,我可以包含 headers,IntellySense 看到名字 在这些文件中。
已将 .lib 文件添加到
Additional Dependencies
部分和该文件的路径VC++ Directories -> Library Directories
和Linker -> General -> Additional Library Directories
. 中的文件
将实际的 .dll 文件放入 DEBUG 文件夹(也放入项目文件夹,只是 可以肯定)
使用
dumpbin.exe
来确定我已经导出所有需要的 类 .dll
而且我仍然得到一堆未解决的外部问题,其功能存储在该 .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 成员。
通常使用宏来完成dllexport
和dllimport
之间的切换。
既然您已经显示了错位的名称,区别就很明显了,并且 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 调用签名。