微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++/CLI 项目,C++ 共享库的包装器,得到错误

如何解决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,这似乎是我问题的确切解决方案,但我无法理解该解决方案。

  1. 关闭 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS。
  2. 从 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 举报,一经查实,本站将立刻删除。