如何处理未提供库的头文件

时间:2012-06-24 13:47:01

标签: c++ static-libraries header-files

我将详细说明一个常见的假设问题。

问题:

我收到了一个静态库说libX.a和标题文件a.hb.h。头文件a.hb.h包含库导出的API。 a.h包括a1.hb.h包括b1.h。但是a1.hb1.h不是由库的所有者发送的,因为a1.hb1.h包含库私有使用的数据结构,并且所有者不想要揭露这些数据结构。

我必须编写一个调用库导出的API的应用程序。所以我必须包含a.hb.h,其中包含API的声明。

好的,好的。我编写应用程序并包含头文件a.hb.h并调用API。但是我会收到编译错误,因为编译器找不到a1.hb1.h内部包含的a.hb.h

问题:

  1. 这个问题有解决方案吗?如果是,请认真寻求解决方案:)

  2. 库所有者是否有必要公开他内部在其库中使用的所有私有头文件?

2 个答案:

答案 0 :(得分:2)

我将从最后一个开始。图书馆的所有者可以隐藏包含私人信息的标题,但他必须确保公共标题不依赖于那些私人标题,即它们不得包含它们!

至于第一个问题,您可以尝试删除那些包含行。它应该编译,但如果没有,创建者可能在私有标题中隐藏了一些重要内容,这对于除了他自己以外的人使用他的库是至关重要的。

答案 1 :(得分:0)

1)您可以查看nm工具,参见SO: how to list symbols in a so-file。也许它适用于静态库,我不确定。

2)图书馆所有者可以使用Large scale C++ software design by John Lakos中的技术来防止暴露内部结构。也许您可以使用其中的技术创建a1.hb1.h所需的部分,而不依赖于您没有的信息。特别是在不定义其内容的情况下声明结构/类。