CMake can';无法从导入项目的依赖项中找到标头

CMake can';无法从导入项目的依赖项中找到标头,cmake,Cmake,我有一个CMake项目C,它依赖于项目B,而项目B又依赖于项目a。我创建了一个超级构建,它构建了所有三个项目。项目C使用项目B中的标题,项目C的我的CmakeList如下所示: 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(

我有一个CMake项目C,它依赖于项目B,而项目B又依赖于项目a。我创建了一个超级构建,它构建了所有三个项目。项目C使用项目B中的标题,项目C的我的CmakeList如下所示:

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)
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)
当我尝试构建项目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”中的include目录将添加到构建中,并且项目C将成功编译。这是必要的吗?我本以为CMake会将项目A的目标与项目B一起导出,因此没有必要从项目C调用find_包(A)。项目C在没有这一点的情况下无法构建这一事实是否表明我导出项目B的方式存在问题?

我认为在
BConfig.CMake中,您应该使用:

include(CMakeFindDependencyMacro)
if(NOT A_FOUND AND NOT TARGET a)
  find_dependency(A REQUIRED)
endif()
参考:


谢谢,成功了。虽然为了让它工作,我还必须修复superbuild文件中的其他错误;在构建项目C时,我需要将“-Da_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/a/lib/CMAKE/a”添加到调用ExternalProject_add的CMAKE_CACHE_参数中。
include(CMakeFindDependencyMacro)
if(NOT A_FOUND AND NOT TARGET a)
  find_dependency(A REQUIRED)
endif()