如何解决库间包含依赖项?

时间:2017-11-18 15:50:29

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

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

使用此PhysicsLib库时,必须包含所使用的类 - 如同使用 - 但这会在使用PhysicsClass时导致问题。当我创建应用程序 PhysicsApplication 并包含PhysicsClass.h时,编译器会注意到此头文件依赖于来自Bullet的头文件。现在,当我想编译我的应用程序PhysicsApplication时,我不仅需要指定PhysicsLib的include目录,还要指定Bullet的include目录。

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

1 个答案:

答案 0 :(得分:2)

您基本上有两种选择:要么将Bullet作为库的界面的一部分,要么将其限制用于库的实施。

接口

第一个是你现在正在做的事情:在你的图书馆的界面部分使用子弹类型,功能等,因此"承认"为了针对您的库进行开发,客户端代码也必须设置Bullet以便在开发中使用。

您应该在文档中预先考虑这一点,并且根据您为客户提供的构建机制,尽可能地设置Bullet作为其中的一部分。作为一个例子:如果您使用CMake并为您的库提供包配置文件,该包配置文件应该找到Bullet并将其设置在库的接口属性中,或者找不到Bullet的错误

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

实施

另一种选择是将Bullet的使用仅限于实施。这实际上意味着隐藏"事实上你根本就在使用Bullet。您的库的任何接口头(=客户端使用的头)都可以引用Bullet中的任何内容。使用Pimpl和类似的习惯用法仅保留Bullet实现。如有必要,将Bullet类型包装在您自己的opaque包装器中,以便Bullet后端仅保留在库的实现中。