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?