c++ - 使用 dll 库时,是否需要包含用于构建 dll 的所有头文件?

标签 c++ dll shared-libraries

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

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

(所以它们也在程序中间接使用,如果不需要包含它们才奇怪。)

最佳答案

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

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

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

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

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


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

关于c++ - 使用 dll 库时,是否需要包含用于构建 dll 的所有头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23652815/

相关文章:

c++ - 在与 Asio 和 OpenSSL 握手期间,*某些*网站上出现错误的版本号错误

c# - GetAwaiter()。GetResult()和.Result都不对我有用,但是Task.Run(await()=> nameOfMethodTobeCalled())。Result可以工作。我听不懂

c++ - 从注入(inject)的 dll 调用时 BeginPaint 失败,即使在目标应用程序中调用 EndPaint 之后也是如此

android - 有没有办法在 Android 中关闭动态加载的库?

c++ - 找不到 MSVCP80.dll(并排问题?)

c++ - 使用 C++ 模板切换策略/算法

c# - 运行时可调用包装类未注册

c++ - 在 MacOS 上构建 conan/cmake 项目时的相对 RPATH

c - "Warning: Linking the shared library against static library is not portable"是什么意思?

c++ - visual c++ 2010调试问题