Dies ist mein Projektbaum:
project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt
| | + CMakeLists.txt
| + src
| | - main.cpp
| - CMakeLists.txt
foo.cpp enthält foo.hpp:
// foo.cpp
#include "foo.hpp"
Jetzt ist das Problem, dass das Einfügen des Verzeichnisses in das oberste CMake erfolgreich foo.hpp, Findet. Wenn ich jedoch das Teilprojekt einbeziehe, funktioniert es nicht. Gibt es einen Grund dafür? (Verzeichnisse sind enthalten, bevor die ausführbare Datei kompiliert wird).
// project/CMakeLists.txt
include_directories(external/foo/include) //OK
add_subdirectory(external)
add_executable(main main.cpp)
target_link_libraries(main foo)
// project/external/CMakeLists.txt
add_subdirectory(foo)
// project/external/foo/CMakeLists.txt
include_directories(include) // NOT WORKING
add_subdirectory(src)
// project/external/foo/src/CMakeLists.txt
add_library(foo foo.cpp)
Zitieren der Dokumentation für include_directories
:
Die Include-Verzeichnisse werden der Verzeichniseigenschaft .__ hinzugefügt. INCLUDE_DIRECTORIES für die aktuelle CMakeLists-Datei. Sie sind auch Der Zieleigenschaft INCLUDE_DIRECTORIES für jedes Ziel in .__ hinzugefügt. die aktuelle CMakeLists-Datei. Die Zieleigenschaftswerte sind die von den Generatoren verwendet.
Die Verzeichnisseigenschaft INCLUDE_DIRECTORIES
wird an alle Unterverzeichnisse und alle Ziele im Verzeichnis vererbt.
${CMAKE_CURRENT_SOURCE_DIR}
für include_directories
ist redundant, da relative Pfade standardmäßig als relativ zu diesem Verzeichnis interpretiert werden. Sie sollten es zur besseren Lesbarkeit auswerfen.get_property
und message
, um zu überprüfen, ob alle Verzeichnisse und Ziele in der INCLUDE_DIRECTORIES
-Eigenschaft die richtigen Einträge enthalten.include_directories
vollständig aufgeben und stattdessen target_include_directories
verwenden. Dies hat den Vorteil, dass Abhängigkeiten, die Abhängigkeiten enthalten, ausschließlich auf Zielebene aufgelöst werden, was normalerweise das wünschenswertere Verhalten ist.Es ist vielleicht ein Umfangsproblem. Ich habe das Gefühl, dass Sie hier versuchen, die Einstellung von /project/external/foo/CMakeLists
auf /project/CMakeLists
zu verbreiten und diese Einstellung an /project/src/CMakeLists
weiterzugeben. Leider ist die Weitergabe von CMakeLists von untergeordneten zu übergeordneten Ebenen in cmake nicht möglich, außer zwischengespeicherten Werten. Dies bedeutet, dass Sie außerdem include_directories (${CMAKE_SOURCE_DIR}/external/foo/include
) im /project/src/CMakeLists.txt
hinzufügen müssen. Oder Sie können diese Zeile, wie Sie es bereits getan haben, einfach in die CMakeLists der obersten Ebene einfügen.