如何解决C++/CLI 项目,C++ 共享库的包装器,得到错误
我试图在托管代码 C# 中使用 Open3d 作为 C++。
我设法将 open3d 的动态共享库制作为运行时库 MD(多线程 DLL)。然后将 Open3D.lib 添加到 C++/CLI 项目中,但是当我编译它时,我得到了一个 LNK2005 错误,如下所示:
Error LNK2005 "public: virtual char const * __cdecl std::exception::what(void)const "
(?what@exception@std@@UEBAPEBDXZ) already defined in Open3D.lib(Open3D.dll)
Open3D wrapper test C:\Users\tpgns\source\repos\Open3dWrapperDll\Open3D wrapper test\MSVCRT.lib(throw_bad_alloc.obj)
在 StackOverflow 中搜索时,找到了一个 Link,这似乎是我问题的确切解决方案,但我无法理解该解决方案。
- 关闭 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS。
- 从 DLL 中明确导出/导入所需的符号(使用 __declspec(export|import))。
当我在 CMakeLists.txt 中关闭 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 以构建 Open3D 时,我无法构建 Open3d 库。而且似乎不可能为 Open3d 库中的每个变量添加 __declspec(export)
。
对于我的问题还有其他解决方案吗?或者我的方法中是否缺少遵循 Link 解决方案的部分?
解决方法
我设法通过构建 open3d 在 C++/CLI 中使用 Open3d 库,因为不使用静态 Windows 运行时库并且不构建共享库。
当我将 CMakeList 选项更改为时它工作正常
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
option (STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" OFF)
我认为在 C++/CLI 中使用 Open3D 共享库几乎是不可能的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。