【问题标题】:How do I resolve inter-library include dependencies?如何解决库间包含依赖项?
【发布时间】:2017-11-18 15:50:29
【问题描述】:

我编写了一个 C++ 库(我们称之为 PhysicsLib),它使用 Bullet 库进行一些物理计算。我创建了一个类 PhysicsClass,它在自己的头文件 PhysicsClass.h 中包含了来自 Bullet 的两个头文件,以便访问一些 Bullet 类。

使用此 PhysicsLib 库时,必须包含所使用的类 — 像往常一样 — 但是在使用 PhysicsClass 时会出现问题。当我创建应用程序 PhysicsApplication 并包含 PhysicsClass.h 时,编译器会注意到这个头文件又依赖于 Bullet 的头文件。现在,当我要编译我的应用程序 PhysicsApplication 时,我不仅要指定 PhysicsLib 的包含目录,还要指定 Bullet 的包含目录。

有哪些可用的解决方案? 我是否只转发声明 PhysicsClass 使用的 Bullet 中的每个类? 我从来不需要转发声明来自 3rd 方库的类,这让我质疑我的库 PhysicsLib 的设计。

【问题讨论】:

  • 你能贴出PhysicsClass.h 标头吗?

标签: c++ shared-libraries static-libraries


【解决方案1】:

您基本上有两个选择:要么将 Bullet 作为库的接口的一部分,,要么将其使用限制在库的实现中。

界面

第一个几乎就是您现在正在做的事情:在库的接口部分使用 Bullet 类型、函数等,因此“承认”为了针对您的库进行开发,客户端代码必须设置 Bullet 以用于开发。

您应该在文档中提前说明这一点,并且根据您为客户提供的构建机制,尽可能多地设置 Bullet。例如:如果您使用 CMake 并为您的库提供包配置文件,则该包配置文件应该找到 Bullet 并在您的库的界面属性中设置它,否则无法找到 Bullet 的错误。

如果您的库有安装程序(或类似安装程序的东西),您可能会考虑提供一个仅包含您的库的版本和另一个包含 Bullet 的版本。

实施

另一种选择是将 Bullet 的使用限制为仅用于实现。这实际上意味着“隐藏”您正在使用 Bullet 的事实。您的库的任何接口标头(= 客户端使用的标头)都可能引用 Bullet 中的任何内容。使用 Pimpl 和类似的习惯用法来保持 Bullet 仅实现。如有必要,将 Bullet 类型包装在您自己的不透明包装器中,以便 Bullet 后端仅保留在您的库的实现中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2014-04-04
    • 2014-04-14
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多