【问题标题】:Using a Find*.cmake file with a header only library使用带有仅标头库的 Find*.cmake 文件
【发布时间】:2021-12-17 10:22:30
【问题描述】:

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

我将 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 文件?

【问题讨论】:

  • 只需将脚本 FindB.cmake 添加到库 A 的安装中(例如通过 install(FILES))。请注意,该脚本的结果特定于运行它的机器。已知该脚本在该机器上有效,因此您可以再次运行该脚本,作为AConfig.cmake 的一部分。确实,在其他机器上该脚本可能不存在。但是另一台机器可能在其他位置下安装了库 B,因此无法使用该脚本在初始机器上的结果。

标签: c++ cmake


【解决方案1】:

@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)

我现在可以使用find_package(A REQUIRED) 将库 A 添加到应用程序 C,然后一切都转移过来了。

再次感谢@Tsyvarev

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多