起点
我有一个C++应用程序(使用VS2019,Window 10 64位(,它严重依赖于Open3D库。一切都很好,我使用的是以前的版本(0.14.x(,它是我使用CMAKE和Visual Studio 2019从源代码构建的。
我想在新版本(0.15.1(中使用一些功能。此外,新版本附带二进制包,因此不再从源代码构建。所以我备份我的当前版本,下载新的二进制文件,并尝试将它们链接到我的项目。
问题
为了从头开始,我删除了Open3D的所有旧条目,并手动插入新条目。以下是条目:
项目属性-->C/C++-->概述-->其他包含目录:
- C:\Open3D\include
- C: \Open3D\include\Open3D\3rdparty
- 其他东西
项目属性-->链接器-->输入-->附加依赖项:
- C:\Open3D\lib\Open3D.lib
- 其他东西
构建现在会导致大量链接器错误,所有错误都连接到fmt
,这似乎是Open3D使用的第三方库。然而,这些似乎只是因为,在我的预编译头中,我有两个关于Open3D的额外包含:
// open3d
#include "open3d/Open3D.h"
#include "open3d/core/Indexer.h"
#include "open3d/t/geometry/RaycastingScene.h"
如果我删除它们,所有的链接错误都会消失,但我面临着另一个问题:TensorIterator
类需要Indexer.h
,RaycastingScene
类需要RaycastingScene.h
,这两个我在项目中都使用了很多。
问题
为什么我需要RaycastingScene
的额外导入,而不需要VoxelblockGrid
,它在同一个命名空间中?我已经尝试过手动克隆、构建和链接fmt
。看起来我可以成功地从自己的代码访问库,但使用Open3D时,我仍然会遇到相同的链接器错误。我该如何使用这两个类?
命名空间与包含文件无关。这只是对类、函数等进行分组和组织的一种方式。例如,vector和cout都在std命名空间中。但是#include不允许您访问向量类。为什么会这样?矢量与I/O无关;如果必须导入整个标准名称空间,这样我就可以编写标准输出,那将是令人不安的。但是,您包含的文件也可能依次包含其他文件。所以,也许您无意中过渡地包含了VoxelblockGrid,这就是它工作正常的原因。
您应该假设它不是以传递方式导入的。标准做法是使导入成为幂等的,也就是说,如果两次#包含同一个文件,则第二个操作为no-op。因此,两次导入该文件没有害处。即使它已经被传递性导入(正如你所建议的,你可以通过测试来确定(,由于实现细节的变化,包的未来更新可能不再需要这种传递性导入,所以它可能会将其删除。如果你不在自己的代码中手动导入,那么你的代码就会中断。