CMake enthält kein Header-Verzeichnis von Submodul A innerhalb von Submodul B

Ich habe ein CMake-Projekt, das so aussieht:

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

Das Teilprojekt "library", A, wird als statische Bibliothek kompiliert und wird zu libsubprojectA.a. Das "Haupt" -Projekt B ist als Binärdatei kompiliert und von der Bibliothek abhängig. mainB.cpp enthält einen Verweis auf headerA.hpp.

Hier ist subprojectA / 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)

Und hier ist subprojectB / CMakeLists.txt:

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

Das Hauptprojekt CMakeLists.txt sieht folgendermaßen aus:

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

Beachten Sie, dass das Unterprojekt B, das Hauptprojekt, in der Liste aufgeführt istVo subprojectA.

Hier ist das Problem. Wenn ich zum ersten Mal "cmake" auf diesem Projekt ausführen,${SubProjectA_INCLUDE_DIRS} ist in SubProjectB nicht gesetzt.

Was ich denke, passiert ist, dass die CMakeLists für SubProjectB zuerst geladen wird, wenn${SubProjectA_INCLUDE_DIRS} wurde noch nicht gesetzt. Als Ergebnis wird ein eigener Include-Pfad zu einer leeren Zeichenfolge festgelegt. Allerdings, obwohllibsubprojectA.a wird erfolgreich erstellt, bevormainBinary, der Include-Pfad wurde bereits vorher leer gesetzt. Als Ergebnis erhalte ich diesen Fehler, wenn ich versuche, @ zu machemainBinary:

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

Es ist eine Problemumgehung, in der deklarativen Welt von CMake in den Hauptprojekt-CMakeLists das Unterprojekt A vor das Unterprojekt B zu setzen. Was ich wirklich will, ist zu wissen, wie ich CMake anzeigen kann, dass dasinclude_directories(${SubProjectA_INCLUDE_DIRS}) Liniehängt davon a für die Definitionen in den CMakeLists von SubProjectA. Gibt es einen besseren Weg, dies zu tun?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage