【问题标题】:CMake can't find header from dependency of imported projectCMake无法从导入项目的依赖项中找到标头
【发布时间】:2021-02-17 15:07:42
【问题描述】:

我有一个依赖于项目 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 的方式存在问题?

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

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

    参考:

    【讨论】:

    • 谢谢,成功了。虽然为了让它工作,我还必须修复我的超级构建文件中的其他错误;在构建项目 C 时,我需要在调用 ExternalProject_Add 的 CMAKE_CACHE_ARGS 中添加“-Da_DIR:STRING=${CMAKE_CURRENT_BINARY_DIR}/a/lib/cmake/a”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2015-02-19
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多