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 共享库几乎是不可能的。