我将详细说明一个常见的假设问题。
问题:
我收到了一个静态库说libX.a
和标题文件a.h
和b.h
。头文件a.h
和b.h
包含库导出的API。 a.h
包括a1.h
,b.h
包括b1.h
。但是a1.h
和b1.h
不是由库的所有者发送的,因为a1.h
和b1.h
包含库私有使用的数据结构,并且所有者不想要揭露这些数据结构。
我必须编写一个调用库导出的API的应用程序。所以我必须包含a.h
和b.h
,其中包含API的声明。
好的,好的。我编写应用程序并包含头文件a.h
和b.h
并调用API。但是我会收到编译错误,因为编译器找不到a1.h
和b1.h
内部包含的a.h
和b.h
。
问题:
这个问题有解决方案吗?如果是,请认真寻求解决方案:)
库所有者是否有必要公开他内部在其库中使用的所有私有头文件?
答案 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.h
和b1.h
所需的部分,而不依赖于您没有的信息。特别是在不定义其内容的情况下声明结构/类。