问题描述
我试图在托管代码 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 共享库几乎是不可能的。