2

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

问题:

我提供了一个静态库,比如libX.a头文件a.hb.h. 头文件a.hb.h包含库导出的 API。a.h包括a1.hb.h包括b1.h。但是a1.hb1.h没有由库的所有者提供,因为a1.h包含b1.h库私人使用的数据结构,并且所有者不想公开这些数据结构。

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

好的。我编写我的应用程序并包含头文件a.hb.h调用 API。但是我会得到一个编译器错误,因为编译器无法找到a1.handb1.h内部包含的a.hand b.h

问题:

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

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

4

2 回答 2

2

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

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

于 2012-06-24T14:47:37.563 回答
0

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

2) 库所有者可以使用John Lakos 在大规模 C++ 软件设计中的技术来防止暴露内部结构。也许您可以使用其中的技术来创建所需的部分,a1.hb1.h无需依赖您没有的信息。特别是在不定义其内容的情况下声明结构/类。

于 2012-06-24T14:57:18.413 回答