Antworten:
Diese Schlüsselwörter werden verwendet, um festzustellen, wann die Liste der Include-Verzeichnisse benötigt wird, die Sie an das Ziel übergeben. Bis wann bedeutet dies, ob diese Include-Verzeichnisse benötigt werden:
Wenn CMake ist ein Ziel der Zusammenstellung, verwendet er die Ziele INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
und COMPILE_OPTIONS
Eigenschaften. Wenn Sie das PRIVATE
Schlüsselwort in target_include_directories()
und gleichermaßen verwenden, weisen Sie CMake an, diese Zieleigenschaften zu füllen.
Wenn CMake eine Abhängigkeit zwischen einem Ziel A und einem anderen Ziel B erkennt (wie bei Verwendung des target_link_libraries(A B)
Befehls), werden die B
Verwendungsanforderungen transitiv an das A
Ziel weitergegeben. Diese Zielverwendungsanforderungen sind die Include-Verzeichnisse, Kompilierungsdefinitionen usw., die jedes Ziel, von dem es abhängt, B
erfüllen muss. Sie werden durch die INTERFACE_*
Version der oben aufgeführten Eigenschaften (wie INTERFACE_INCLUDE_DIRECTORIES
) angegeben und INTERFACE
beim Aufrufen der target_*()
Befehle mit dem Schlüsselwort gefüllt.
Das PUBLIC
Schlüsselwort bedeutet ungefähr PRIVATE + INTERFACE
.
Angenommen, Sie erstellen eine Bibliothek A
, die einige Boost-Header verwendet. Du würdest:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
Wenn Sie nur diese Boost-Header in Ihren Quelldateien ( .cpp
) oder privaten Header-Dateien ( .h
) verwenden.target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
Wenn Sie diese Boost-Header nicht in Ihren Quelldateien verwenden (sie müssen daher nicht kompiliert werden A
). Ich kann mir dafür kein reales Beispiel vorstellen.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
Wenn Sie diese Boost-Header in Ihren öffentlichen Header-Dateien verwenden, die BEIDE in einigen A
Quelldateien enthalten sind und möglicherweise auch in einem anderen Client Ihrer A
Bibliothek enthalten sind.In der CMake 3.0-Dokumentation finden Sie weitere Details zu diesen Eigenschaften der Buildspezifikation und den Verwendungsanforderungen .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Dies bedeutet, dass Sie Dateien direkt in Ihre Bibliothek aufnehmen können, aber als Benutzer der Bibliothek müssen Sie libname/
zuerst einfügen .
target_include_directories()
ein ausführbares Ziel anfordern, wenn Sie Include-Verzeichnisse festlegen müssen, in denen Header-Dateien gefunden werden sollen, die von diesen ausführbaren Dateien verwendet werden (z. B. Boost :: Program_options, wenn Sie damit Argumente in Ihrer main()
Funktion analysieren ). . PRIVATE
In diesem Fall würden Sie wahrscheinlich das Schlüsselwort verwenden, da diese Dateien zum Kompilieren der ausführbaren Datei selbst benötigt werden. Ich weiß jedoch nicht, ob es eine Verwendung für INTERFACE
oder PUBLIC
auf einer ausführbaren Datei gibt.
Die Schlüsselwörter INTERFACE, PUBLIC und PRIVATE sind erforderlich, um den Umfang der folgenden Argumente anzugeben. PRIVATE- und PUBLIC-Elemente füllen die INCLUDE_DIRECTORIES-Eigenschaft von <ziel>. PUBLIC- und INTERFACE-Elemente füllen die INTERFACE_INCLUDE_DIRECTORIES-Eigenschaft von <ziel>. Die folgenden Argumente geben include-Verzeichnisse an.
Aus der Dokumentation: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Um die Dokumentation mit meinen eigenen Worten neu zu formulieren: