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

  • 本文关键字:依赖 导入 项目 CMake cmake
  • 更新时间 :
  • 英文 :


我有一个CMake项目C,它依赖于项目B,而项目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)

我的Config.cmake.in项目B看起来像

@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会将项目A的目标与项目B一起导出,从而没有必要从项目C中调用find_package(A)。如果没有这个,项目C无法构建的事实是否表明我导出项目B的方式存在问题?

我认为在BConfig.cmake.in中你应该使用:

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

裁判:

  • https://cmake.org/cmake/help/latest/module/CMakeFindDependencyMacro.html

最新更新