CMake使用install/export导出库时如何避免安装依赖项的头文件
问题根因
你当前的配置存在3个核心错误:
- 错误将内部依赖
dependencyA、dependencyB关联到了exampleLib的公开导出集
因为你在install(TARGETS)里同时列了exampleLib dependencyA dependencyB,并且绑定了EXPORT exampleLibTargets参数,CMake要求导出集中所有目标的PUBLIC链接依赖都必须在同一个导出集里,这也是你之前不加dependencyB就报错的原因。同时你给所有目标加了INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}参数,会触发CMake自动安装所有导出目标的PUBLIC头文件的逻辑,而你根本没有配置dependencyA、dependencyB的头文件安装规则,也没有给他们设置正确的安装态头文件路径,因此会出现头文件找不到的报错。 - 不必要导出内部依赖
你对dependencyA的链接是PRIVATE属性,意味着dependencyA、dependencyB完全是exampleLib的内部依赖,exampleLib的使用者完全不需要感知这两个依赖的存在,根本不需要将他们加入公开导出集。 - 代码笔误
你当前配置里target_include_directories的目标名写的是dashStreamerClient,和你实际定义的库名exampleLib不符,会导致头文件路径配置失效。
修复方案
按如下步骤修改主项目CMake配置即可:
- 修正头文件路径配置的目标名笔误
- 拆分安装规则:仅将对外公开的
exampleLib关联到导出集,dependencyA、dependencyB单独安装且不关联导出集,也不添加INCLUDES DESTINATION参数 - 如果不需要对外提供
dependencyA、dependencyB的库文件,可直接将这两个依赖编译为静态库,他们的代码会自动合并到exampleLib的共享库中,连这两个依赖的库安装规则都可以直接删掉。
修改后的核心安装规则示例:
# 仅对外导出exampleLib,关联导出集 install(TARGETS exampleLib EXPORT exampleLibTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) # 单独安装内部依赖的库文件,不关联导出集,不需要安装头文件就不加INCLUDES参数 install(TARGETS dependencyA dependencyB LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) # 剩下的exampleLib头文件安装、导出配置、Config文件生成逻辑保持不变即可
内容的提问来源于stack exchange,提问作者kekpirat
相关产品推荐
相关产品推荐

