cmake - CMake无法从导入项目的依赖项中找到标头
问题描述
我有一个依赖于项目 B 的 CMake 项目 C,而项目 B 又依赖于项目 A。我创建了一个构建所有三个的超级构建。项目 C 使用项目 B 的标头,我的项目 C 的 CMakeLists 如下所示:
cmake_minimum_required(VERSION 3.10)
project(code_c)
find_package(b REQUIRED)
add_library(c c.c)
target_link_libraries(c PUBLIC b)
target_include_directories(c INTERFACE
$<INSTALL_INTERFACE:include>)
install(TARGETS c EXPORT c)
install(FILES c.h DESTINATION include)
export(PACKAGE c)
export(TARGETS c FILE "${PROJECT_BINARY_DIR}/bTargets.cmake")
install(EXPORT c FILE aTargets.cmake DESTINATION lib/cmake/c)
include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/cConfig.cmake"
INSTALL_DESTINATION lib/cmake/c)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/cConfig.cmake"
DESTINATION lib/cmake/c)
install(EXPORT c
FILE cTargets.cmake
DESTINATION lib/cmake/c)
我的项目 B 的 CMakeLists 如下所示:
cmake_minimum_required(VERSION 3.10)
project(code_b)
find_package(a REQUIRED)
add_library(b b.c)
target_link_libraries(b PUBLIC a)
target_include_directories(b INTERFACE
$<INSTALL_INTERFACE:include>)
install(TARGETS b EXPORT b)
install(FILES b.h DESTINATION include)
export(PACKAGE b)
export(TARGETS b FILE "${PROJECT_BINARY_DIR}/bTargets.cmake")
install(EXPORT b FILE aTargets.cmake DESTINATION lib/cmake/b)
include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/bConfig.cmake"
INSTALL_DESTINATION lib/cmake/b)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/bConfig.cmake"
DESTINATION lib/cmake/b)
install(EXPORT b
FILE bTargets.cmake
DESTINATION lib/cmake/b)
我的项目 B 的 Config.cmake.in 看起来像
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/bTargets.cmake")
check_required_components(b)
当我尝试构建项目 C 时,我得到
/Users/jhaiduce/Development/cmake_include_test/build/b/include/b.h:4:10: fatal error:
'a.h' file not found
#include "a.h"
^~~~~
1 error generated.
但是,如果我添加find_package(a REQUIRED)
到项目 A 的 CMakeLists.txt 中,则目标“a”中的包含目录将添加到构建中,并且项目 C 编译成功。这应该是必要的吗?我原以为 CMake 会与项目 B 一起导出项目 A 的目标,从而无需从项目 C 调用 find_package(a)。如果没有此项目 C 无法构建,是否表明我导出项目 B 的方式存在问题?
解决方案
我认为BConfig.cmake.in
你应该使用:
include(CMakeFindDependencyMacro)
if(NOT A_FOUND AND NOT TARGET a)
find_dependency(A REQUIRED)
endif()
参考:
推荐阅读
- json - Ansible 代码读取 json 文件以创建输出
- google-sheets - 我想将此查询用作数组公式
- php - 如何在 macOS Catalina 上使用 brew 为 PHP 7.4 安装 memcached 3.1.4?
- sql - 如何查询客户之前是否给过较低的评价?
- c# - 连接列表的属性
并在 C# 中写入文件 - wpf - 第一次左键单击 wpf 按钮时 ContextMenu 为空
- cuda - Correct implementation of spin lock in CUDA
- knockout.js - Confused with legacy knockout code. Can't tell if it's commented out or not
- php - psr-4 autoload not working on namecheap.com live server
- java - Use "()" in Spring data.repository @query annotation