it-swarm.com.de

Cmake include_directories ()

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)
16
memecs

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.

  • Die Angabe von ${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.
  • Das Angeben eines Include-Verzeichnisses in einem Unterverzeichnis und seinem übergeordneten Element ist redundant. Sie sollten dies vermeiden und sich an einem Ort niederlassen.
  • Verwenden Sie get_property und message , um zu überprüfen, ob alle Verzeichnisse und Ziele in der INCLUDE_DIRECTORIES-Eigenschaft die richtigen Einträge enthalten.
  • Wenn Sie CMake 2.8.11 als Mindestanforderung verwenden möchten, sollten Sie 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.
27
ComicSansMS

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.

0
summer.icecream