为啥使用这个库需要它的内部头文件?

Posted

技术标签:

【中文标题】为啥使用这个库需要它的内部头文件?【英文标题】:Why using this library needs its internal headers?为什么使用这个库需要它的内部头文件? 【发布时间】:2017-02-01 10:52:57 【问题描述】:

我有一个使用 google 日志库 (glog) 的库 A.dll。现在我想在另一个项目中使用这个库,在我自己的项目中我不想使用 glog。我只想使用A.dll,但是在编译过程中,编译器说找不到logging.h头!!!

为什么会这样?!它是 A.dll 内部使用的标头,我想使用 A 的接口而不是 glog。我认为包含 A.h 就足够了,我不需要 logging.h 。我错了吗?知道是什么问题吗?

A.dll 是使用 MSVC++ 2015 构建的,我在 QT Creator 中使用的是 MSVC++ 2015。

【问题讨论】:

如果 A.dll 依赖于另一个库,那么如果不重建 A.dll 以使其在没有该依赖项的情况下工作,您根本无法消除该依赖项。 我有 glog 库并已配置我的项目以查找 glog dll。我有 logging.h 和所有其他 glog 标题。但我的问题是为什么编译器在我的项目中需要 glog 头文件? 可能其中一个A.dll头文件需要它? @Someprogrammerdude : 是的,这很明显,但是它的内部使用需要 glog,日志记录不在 A 的接口中。客户端代码是否需要库代码中使用的所有标头?我不这么认为。 因为头文件包含函数的原型,一些全局变量,而库有定义,所以你只包含这些头文件并链接到这些库。 【参考方案1】:

您没有提供关于 glog 头文件如何以及在何处包含在 A 库中的证据。 但是我们可以假设它是#included 在公共库头文件之一中, 您的项目包括使用该库, 所以你错误地得到了 glog 头文件的依赖。

其中一个原因是 A 库的开发人员做得不好,未能隐藏内部唯一的依赖项。

如何克服间接包含依赖? 这取决于 A 库头文件的编写方式,以及您或原始 A 库开发人员是否可以更改它以避免暴露内部依赖关系。

【讨论】:

以上是关于为啥使用这个库需要它的内部头文件?的主要内容,如果未能解决你的问题,请参考以下文章

C++程序在使用GDAL时为啥必须包含头文件:gdal_priv.h?gdal_priv.h包含的是啥文件?

devc++格式为啥那么丑

main函数包含在哪个头文件里,为啥使用main函数时不用先包含其所在的头文件

为啥我们需要在 C++ 头文件中使用“#if defined Identifier”?

为啥这个操作PE文件头的代码使用了这么奇怪的偏移值?

为啥不包含头文件却可以调用函数,谁来解释