CMake не включает каталог заголовков подмодуля A в подмодуле B

У меня есть проект CMake, который выглядит так:

project/
  CMakeLists.txt
  subprojectA/
    CMakeLists.txt
    include/
      headerA.hpp
    src/
      libraryA.cpp
  subprojectB/
    CMakeLists.txt
    src/
      mainB.cpp

Подпроект «библиотека», A, компилируется как статическая библиотека и становится libsubprojectA.a. «Основной» проект B компилируется как двоичный файл и зависит от библиотеки. mainB.cpp включает ссылку на headerA.hpp.

Вот подпроект A / CMakeLists.txt:

project(SubProjectA)
include_directories(include)
add_library(subprojectA STATIC src/libraryA.cpp)
set(${PROJECT_NAME}_INCLUDE_DIRS
    ${PROJECT_SOURCE_DIR}/include
    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)

А вот и подпроект B / CMakeLists.txt:

project(SubProjectB)
include_directories(${SubProjectA_INCLUDE_DIRS})
add_executable(mainBinary src/mainB.cpp)
target_link_libraries(mainBinary subprojectA)

Основной проект CMakeLists.txt выглядит так:

project(Project)
add_subdirectory(subprojectB)
add_subdirectory(subprojectA)

Обратите внимание, что основной проект subprojectB указандо subprojectA.

Здесь проблема. Когда я впервые запускаю «cmake» для этого проекта,${SubProjectA_INCLUDE_DIRS} не установлен в SubProjectB.

Я думаю, что происходит, что CMakeLists для SubProjectB загружается первым, когда${SubProjectA_INCLUDE_DIRS} еще не было установлено. В результате он устанавливает собственный путь включения для пустой строки. Тем не менее, даже еслиlibsubprojectA.a успешно строится раньшеmainBinary, путь включения уже был заранее установлен пустым. В результате я получаю эту ошибку при попытке сделатьmainBinary:

subprojectB/src/mainB.cpp:1:23: fatal error: headerA.hpp: No such file or directory
#include "headerA.hpp"
                      ^

Это обходной путь, чтобы поместить subprojectA перед subprojectB в главном Project CMakeLists в декларативном мире CMake. Что я действительно хочу, так это знать, как правильно указать CMake, чтоinclude_directories(${SubProjectA_INCLUDE_DIRS}) линиязависит на определениях, которые существуют внутри CMakeLists SubProjectA. Есть лучший способ сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос