Ich habe eine Verzeichnisstruktur für meinen C ++ - Code, die folgendermaßen aussieht:
|
|->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 verstehen CMake
.
Was ist der Unterschied zwischen ihrer Verwendung und dem Pfad, den ich verwenden soll, um meinen Include-Dateipfad hinzuzufügen?
include_directories
und gelesentarget_include_directories
? Was verstehen Sie nicht über den Unterschied zwischen ihnen?Antworten:
include_directories(x/y)
wirkt sich auf den Verzeichnisbereich aus. Allen Zielen in dieser CMakeList sowie denen in allen Unterverzeichnissen, die nach dem Zeitpunkt des Aufrufsx/y
hinzugefügt wurden , wird der Pfad zu ihrem Include-Pfad hinzugefügt.target_include_directories(t x/y)
hat Zielbereich - fügtx/y
den Einschlusspfad für das Ziel hinzut
.Sie möchten das erstere, wenn alle Ihre Ziele die betreffenden Include-Verzeichnisse verwenden. Sie möchten letzteres, wenn der Pfad zielspezifisch ist oder wenn Sie die Sichtbarkeit des Pfads genauer steuern möchten. Letzteres kommt von der Tatsache , dass
target_include_directories()
die StützenPRIVATE
,PUBLIC
undINTERFACE
Qualifizierer.quelle
x/y
der Include-Pfad aller abhängigen Ziele, diet
in ihrentarget_link_libraries
Befehlen verwendet werden, eingegeben wird. Natürlich gibt es einen Platz für Ersteres, aber ich glaube, Letzteres ist im Allgemeinen besser.include_directories
betroffen sind. Ich bearbeite die Antwort: In der Dokumentation wird eindeutig angegeben, dass alle Ziele in den aktuellen CMakeLists betroffen sind. Die Dokumentation erwähnt nicht, aber nur Unterverzeichnisse nach dem Anruf sind betroffen (wie in der ursprünglichen Antwort korrekt angegeben)target_include_directories
wurde in CMake 2.8.11 (Mai 2013) eingeführtNeben der richtigen Antwort von Angew besteht ein weiterer sehr wichtiger Unterschied zwischen
include_directories
undtarget_include_directories
darin, dass letztere bei Verwendung mitPUBLIC
oderINTERFACE
dieINTERFACE_INCLUDE_DIRECTORIES
Eigenschaft des Ziels füllen. Diese Eigenschaft ist nützlich, wenn ein anderes Zieltarget_link_libraries
zum Verknüpfen mit dem ursprünglichen Ziel verwendet wird, da dem Verknüpfungsziel automatisch die Include-Verzeichnisse hinzugefügt werden. Siehe Beispiel .Diese wichtige Funktion ist in der Dokumentation ziemlich gut versteckt: target_include_directories erwähnen das Auffüllen
INTERFACE_INCLUDE_DIRECTORIES
, dessen Dokumentation lautet:quelle
PUBLIC
usw. Eigenschaften lese ! Danke: DWie @Angew sagte, ist der Unterschied:
1, include_directories () ist für alle Dateien im Quellbaum zugänglich. 2, target_include_directories () ist beim Kompilieren nur für ein bestimmtes Ziel zugänglich.
quelle