【问题标题】:Can I create a c++ library that links another library but doesnt depend on its includes?我可以创建一个链接另一个库但不依赖于它的包含的 c++ 库吗?
【发布时间】:2016-04-16 14:10:06
【问题描述】:

我想创建一个链接SFML 库和其他库的动态/静态库。我现在的问题是,在项目中取消我的库时,我必须确保 SFML includes 可用于该项目。
我能否以某种方式消除对第三方标头的依赖?header-only 图书馆怎么样?

其他库如何处理这个问题(使用SFML 时,即使SFML 依赖于其他库,我也只需要它们的标头)

【问题讨论】:

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


    【解决方案1】:

    您将不得不重新组织您的头文件并重新构建您的代码。你需要有两组头文件:

    • 用于构建库的内部头文件,这些头文件包含并引用SFML 的头文件、类和资源。

    • 构成库接口的公共头文件。

    您的库仅安装公共集。公共头文件不包含SFML 头文件,并且它们不引用任何SFML 类。

    您的公共头文件和类通常会声明但不定义内部类和指向它们的指针。内部类仅在您自己的内部头文件中定义。

    您应该花一些时间查看一些大型、流行的 C++ 库中的头文件。您经常会发现未在公共头文件中定义的内部类的指针和其他引用。它们是库使用的内部类,不公开。

    甚至许多 C 库也是这样构造的。

    【讨论】:

    • 感谢您的快速回答:),那么这会出现同样的问题吗?我有一个包含 SFML 标头的 A 类(A.h/A.cpp)。我现在有B.h,其中包括A.h。使用库并包括其B.h 时,我还需要标头吗?
    • 是的。如果 A.h 包含 SFML 标头,则它是必需的。重写 B.h 使其不包含 A.h。正如我所说:去看看其他库是如何做到这一点的。
    • 如果这不起作用,消除对 SFML 的依赖的唯一方法是通过 Forward-Declaration 对吗?但是如果我需要一个普通的SFML-type 成员怎么办?
    • 正如我所解释的:将这些对象放在一个内部类中,并使用一个来自公共类的指针,在公共头文件中定义,指向一个前向声明的内部类。您将与 SFML 相关的所有内容隐藏在内部类中,这些内容仅在公共标头中前向声明。 ...您甚至不需要指针。您可以声明前向声明类的容器,即 std::vector。只有当它被构造或引用时,internal_class 的定义才需要可用。
    • 好的,你能给我推荐一个图书馆,在那里我可以很容易地看到他们是如何做到的吗?我也会查看 SFML 源代码,也许我可以在那里找到某事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2015-09-12
    • 2015-04-18
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多