-1

我正在尝试在托管代码 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 搜索时,找到了一个似乎是我的问题的确切解决方案的链接,但我无法理解该解决方案。

  1. 关闭 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS。
  2. 从 DLL 中显式导出/导入所需的符号(使用 __declspec(export|import).

当我在 CMakeLists.txt 中关闭 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 以构建 Open3D 时,我无法构建 Open3d 库。而且似乎不可能为__declspec(export)Open3d 库中的每个变量添加。

我的问题还有其他解决方案吗?或者我的方法中是否缺少遵循链接解决方案的部分?

4

1 回答 1

-1

我通过构建 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 共享库几乎是不可能的。

于 2021-01-12T07:44:30.217 回答