it-swarm.com.de

Was ist der Unterschied zwischen include_directories und target_include_directories in CMake?

Ich habe eine Verzeichnisstruktur für meinen C++ - Code, die folgendermaßen lautet:

|
|->include
|->src

Ich schreibe eine CMakeLists.txt-Datei für meinen Code. Ich möchte den Unterschied zwischen include_directories und target_include_directories in CMake verstehen.

Was ist der Unterschied zwischen ihrer Verwendung und um meinen Include-Dateipfad hinzuzufügen, den ich verwenden sollte?

76
Ujjwal Aryan

include_directories(x/y) beeinflusst den Verzeichnisumfang. Für alle Ziele in dieser CMakeList sowie für diejenigen in allen Unterverzeichnissen, die nach dem Aufrufpunkt hinzugefügt werden, wird der Pfad x/y zu ihrem Include-Pfad hinzugefügt.

target_include_directories(t x/y) hat einen Zielbereich - fügt x/y dem Include-Pfad für das Ziel t hinzu.

Sie möchten das vorherige, wenn alle Ihre Ziele die betreffenden Include-Verzeichnisse verwenden. Sie möchten den letzteren, wenn der Pfad für ein Ziel spezifisch ist oder wenn Sie die Sichtbarkeit des Pfads genauer steuern möchten. Letzteres kommt von der Tatsache, dass target_include_directories() die Qualifier PRIVATE, PUBLIC und INTERFACE unterstützt.

86
Angew

Abgesehen von dem, was Angews Antwort richtig sagt, besteht ein weiterer sehr wichtiger Unterschied zwischen include_directories und target_include_directories darin, dass letztere bei Verwendung mit PUBLIC oder INTERFACE die INTERFACE_INCLUDE_DIRECTORIES-Eigenschaft des Ziels füllen. Diese Eigenschaft ist nützlich, wenn ein anderes Ziel target_link_libraries für die Verknüpfung mit dem ursprünglichen Ziel verwendet, da das Verknüpfungsziel automatisch um die Include-Verzeichnisse erweitert wird. Siehe Beispiel .

Diese wichtige Funktion ist in der Dokumentation ziemlich gut versteckt: target_include_directories erwähnen Sie das Auffüllen von INTERFACE_INCLUDE_DIRECTORIES, dessen Dokumentation sagt:

Wenn Zielabhängigkeiten mit target_link_libraries () , .__ angegeben werden. CMake liest diese Eigenschaft aus allen Zielabhängigkeiten in Bestimmen Sie die Build-Eigenschaften des Verbrauchers.

27
Antonio

Wie @Angew sagte, ist der Unterschied:

1, auf include_directories () kann für alle Dateien im Quellbaum zugegriffen werden 2, target_include_directories () ist nur für ein bestimmtes Ziel beim Kompilieren zugänglich. 

0
Nick.Rhan