c++ - 如何解决库间包含依赖关系?

标签 c++ shared-libraries static-libraries

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

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

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

最佳答案

您基本上有两个选择:要么让 Bullet 成为您的库界面的一部分,,或者将其使用限制在您的库的实现中。

界面

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

您应该在文档中坦率地说明这一点,并且根据您向客户提供的构建机制,尽可能将设置 Bullet 作为其中的一部分。举个例子:如果您使用 CMake 并为您的库传送包配置文件,则该包配置文件应找到 Bullet 并在库的接口(interface)属性中进行设置,否则无法找到 Bullet 错误。

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

实现

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

关于c++ - 如何解决库间包含依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47367953/

相关文章:

c - 如何在 C 程序中链接 D 库?

android - MongoDB Mobile 错误 'loading android-aarch64/libmongo_embedded_capi.so'

gcc - 构建 R 包时如何链接静态库

gcc - 静态库中目标文件的顺序

c++ - Qt鼠标事件左键不翻译qt对象

c++ - 如何选择二维数组中的另一列?

c# - 无法将 System.Data.Spatial 添加到我的域类

c++ - GCC 编译的静态库包含什么?

c++ - 使用 SIMD 进行 HOG 优化

C++:如何让代码自动输入随机数?