【发布时间】: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,因此无法使用该脚本在初始机器上的结果。