CMake单目录下库目标公开/私有头文件相关技术问询
项目CMake配置问题解答
问题1:该配置能否让其他可执行文件/库在安装位置链接MyLibrary时,无法访问私有头文件?
可以。具体原因:
- 安装流程仅会把
PUBLIC_HEADER属性指定的foo_public.h、bar_public.h复制到${INSTALL_LOCATION}/include目录,私有头文件foo_private.h和bar_private.h不会被安装。 - 其他项目链接已安装的MyLibrary时,只能访问安装目录下的文件,自然无法获取未被安装的私有头文件。
问题2:公开与私有头文件位于target_include_directories指定的同一目录,是否会产生影响?
会存在两方面的影响:
- 开发阶段封装性受损:在本地构建依赖MyLibrary的项目时(未执行安装,直接通过
target_link_libraries链接),由于include目录被设为PUBLIC权限,依赖项目可以直接包含私有头文件,破坏了库的内部实现封装。 - 误操作风险提升:如果后续修改CMake配置时失误,比如误将私有头文件加入
PUBLIC_HEADER列表,会导致私有头文件被意外安装,暴露内部实现细节。
当前的安装配置虽然能正确区分公开和私有头文件,但同一目录的结构会增加误操作概率。如果后续允许调整项目结构,建议将私有头文件移至单独子目录(如include/internal),并通过PRIVATE权限为MyLibrary添加该目录的包含路径,从根源避免上述问题。
内容的提问来源于stack exchange,提问作者Dominic Sesto
相关产品推荐
相关产品推荐

