【问题标题】:When using a dll library, is it necessary to include all of the headers used to build the dll?使用 dll 库时,是否需要包含用于构建 dll 的所有头文件?
【发布时间】:2014-05-15 08:11:01
【问题描述】:

我从 C++ 源代码构建了一个共享库 (.dll)。

现在当我想在另一个程序中使用这个库时,我是否需要包含最初用于构建库的所有头文件,或者只包含属于我的(新)程序中使用的函数的头文件够了吗?库中有很多函数在我的新程序中没有直接使用,但不用说,它们都被程序中的函数使用。

(所以程序中也间接使用了,如果没有必要包含,那就奇怪了。)

【问题讨论】:

    标签: c++ dll shared-libraries


    【解决方案1】:

    头文件没有什么神奇之处,它们只是确保您的.cpp 文件可以访问它所需的所有声明和定义的一种便捷方式。因此,请仅在每个文件中包含您实际需要的内容(1)

    以上是指将#include 语句放入您的文件中——仅对您实际需要使用的头文件执行此操作。当然,你包含的头文件可以#include其他头文件本身。

    与任何其他行为良好(即实际可用)的 DLL 一样,您的 DLL 必须提供一组公共接口头文件。在正常情况下,您必须拥有所有这些公共接口头文件,才能使用该 DLL 构建程序。这并不意味着你应该#include他们所有人;恰恰相反,你不应该。编译器(实际上是预处理器)将#include 它需要的东西。

    请注意,当构建 DLL 本身时,可能会涉及更多的头文件,但这些是实现私有的,而不是公共接口的一部分。您不需要它们来使用 DLL 构建程序,而且在一般情况下您甚至无权访问它们。

    因此,在设计您自己的 DLL 时,您必须严格区分公共头文件和内部头文件。公共头文件必须对客户端可用,内部的不需要(除非客户端应该自己构建 DLL)。当然,这意味着公共头文件可能永远不会#include 内部头文件。


    (1) 请注意,包含的头文件是纯文本的——在读取源文件时,预处理器会有效地复制头文件的内容并将其粘贴到 #include 语句的位置,然后继续解析。您是自己复制和粘贴的,该文件也可以构建和运行。当然,它不会在头文件中获取以后的更改,这是首先使用头文件的主要原因。

    【讨论】:

    • 但是,很多头文件都包含在我调用的函数的头文件中(并包括它们相应的头文件)。编译器是如何知道它们的?
    • @user215721 #include DLL 头文件中的语句将像任何其他 #include 语句一样被解析。我会稍微扩展一下答案,也许我们指的是“包含”这个词的不同含义。
    • 非常感谢。你的最后一句话实际上给了我答案:当然,这意味着公共头文件可能永远不会#include 内部的。 现在我必须通过复制粘贴他们的代码来使我的许多头文件成为内部的代替其他公开的#includes。
    • @user215721 我认为这不是正确的解决方案。最好重构你的代码和文件,这样内部的东西(类型、函数等)就不会在公共头文件中被引用。当然,DLL 的.cpp 文件和内部头文件可以很高兴地#include 公共和内部头文件。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多