为什么需要包含库中的某些类而不包含其他类



起点

我有一个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.hRaycastingScene类需要RaycastingScene.h,这两个我在项目中都使用了很多。

问题

为什么我需要RaycastingScene的额外导入,而不需要VoxelblockGrid,它在同一个命名空间中?我已经尝试过手动克隆、构建和链接fmt。看起来我可以成功地从自己的代码访问库,但使用Open3D时,我仍然会遇到相同的链接器错误。我该如何使用这两个类?

命名空间与包含文件无关。这只是对类、函数等进行分组和组织的一种方式。例如,vector和cout都在std命名空间中。但是#include不允许您访问向量类。为什么会这样?矢量与I/O无关;如果必须导入整个标准名称空间,这样我就可以编写标准输出,那将是令人不安的。但是,您包含的文件也可能依次包含其他文件。所以,也许您无意中过渡地包含了VoxelblockGrid,这就是它工作正常的原因。

您应该假设它不是以传递方式导入的。标准做法是使导入成为幂等的,也就是说,如果两次#包含同一个文件,则第二个操作为no-op。因此,两次导入该文件没有害处。即使它已经被传递性导入(正如你所建议的,你可以通过测试来确定(,由于实现细节的变化,包的未来更新可能不再需要这种传递性导入,所以它可能会将其删除。如果你不在自己的代码中手动导入,那么你的代码就会中断。

最新更新