我计划将一个 C++ 项目构建为 DLL,以供其他 C++ 项目使用。构建 DLL 时,您可能认为我希望将项目中的所有已编译头文件对象链接到 DLL 构建中。但是,我不希望 DLL 的用户能够访问所有这些头文件。
例如,假设某个 DLL 项目具有以下标头:
FORFRUITSONLY.h
orange.h
apple.h
orange.h
和apple.h
两者#include
FORFRUITSONLY.h
,否则它们将无法运行。但是,我希望此 DLL 的用户只能在尝试时才能#include
orange.h
和/或apple.h
希望编译器失败#include
FORFRUITSONLY.h
。我该如何实现这一点?
我通常解决这个问题的方法是将 DLL 头分成两部分,一个是项目内部头,另一个是要从其他项目包含进来的公共头。
这里的棘手部分是需要包括公共接口的任何部分。
例如,如果您导出具有 std::string 成员的类型,那么您将需要将 #include 作为公共标头的一部分。
如果您还没有这样做,还有一个建议就是研究一下 pimpl idiom,并使公共接口尽可能精简。与模板库不同,DLL 的客户端不需要(或至少非常有限地)了解库的内部运作方式。