首页 > 解决方案 > 使用带有仅标头库的 Find*.cmake 文件

问题描述

我正在创建一个仅包含头文件的库(库 A),其中包含使用其FindB.cmake文件的另一个库(库 B)。

我将 FindB.cmake 文件包含在 cmake 目录中并执行以下操作:

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

find_package(B REQUIRED)

target_link_libraries(A INTERFACE B::B)

库 A 上的测试一切正常,因此 B 成功包含在 A 中。为了使 B 可用于想要包含 A 的项目,我在我的AConfig.cmake.in

include(CMakeFindDependencyMacro)
find_dependency(B REQUIRED)

但是,当我尝试创建一个使用库 A(带有find_package(A REQUIRED))的应用程序(应用程序 C)时,我收到一个错误,即 cmake 找不到该FindB.cmake文件。如果我将FindB.cmake文件放入 App C 项目并像使用库 A 一样包含它,错误就会消失,但我不希望使用库 A 的人需要该FindB.cmake文件。

有没有一种方法可以将所有位置信息FindB.cmake从库 A 转移到应用程序 C,而无需包含实际FindB.cmake文件?

标签: c++cmake

解决方案


@Tsyvarev 有答案。

我添加了这个来安装FindB.cmake

install(FILES "${PROJECT_SOURCE_DIR}/cmake/FindB.cmake"
        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/A/cmake
)

然后在我的 中AConfig.cmake.in,我使用以下内容对其进行了编辑:

set(CMAKE_MODULE_PATH @CMAKE_INSTALL_DATAROOTDIR@/A/cmake @CMAKE_MODULE_PATH@)

find_dependency(B REQUIRED)

我现在可以将库 A 添加到应用程序 C,find_package(A REQUIRED)并且所有内容都可以转移。

再次感谢@Tsyvarev


推荐阅读