Quelle est la signification du mot - clé PUBLIC
, PRIVATE
et en INTERFACE
rapport avec CMake de target_include_directories
?
Réponses:
Ces mots-clés sont utilisés pour indiquer quand la liste des répertoires d'inclusion que vous transmettez à la cible est nécessaire. Par quand , cela signifie que si ces répertoires d'inclusion sont nécessaires:
Lorsque CMake compile une cible, il utilise les cibles INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
et les COMPILE_OPTIONS
propriétés. Lorsque vous utilisez le PRIVATE
mot - clé in target_include_directories()
and alike, vous indiquez à CMake de renseigner ces propriétés cibles.
Lorsque CMake détecte une dépendance entre une cible A et une autre cible B (comme lorsque vous utilisez la target_link_libraries(A B)
commande), il propage de manière transitoire B
les exigences d'utilisation vers la A
cible. Ces exigences d'utilisation de la cible sont les répertoires d'inclusion, les définitions de compilation, etc. que toute cible qui dépend B
doit satisfaire. Ils sont spécifiés par la INTERFACE_*
version des propriétés listées ci-dessus (comme INTERFACE_INCLUDE_DIRECTORIES
) et sont renseignés à l'aide du INTERFACE
mot - clé lors de l'appel dutarget_*()
commandes.
Le PUBLIC
mot-clé signifie à peu près PRIVATE + INTERFACE
.
Par conséquent, supposons que vous créez une bibliothèque A
qui utilise des en-têtes Boost. Vous feriez:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
si vous n'utilisez ces en-têtes Boost que dans vos fichiers source ( .cpp
) ou vos fichiers d'en- tête privés ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
si vous n'utilisez pas ces en-têtes Boost dans vos fichiers source (par conséquent, vous n'avez pas besoin de les compiler A
). Je ne peux pas vraiment penser à un exemple réel pour cela.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
si vous utilisez ces en-têtes Boost dans vos fichiers d'en-tête publics, qui sont inclus À LA FOIS dans certains A
fichiers source de et peuvent également être inclus dans tout autre client de votre A
bibliothèque.La documentation CMake 3.0 contient plus de détails sur cette spécification de construction et les propriétés des exigences d'utilisation .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Cela signifie que dans votre bibliothèque, vous pouvez inclure des fichiers directement, mais en tant qu'utilisateur de la bibliothèque, vous devez d' libname/
abord insérer .
target_include_directories()
une cible exécutable si vous devez définir des répertoires d'inclusion dans lesquels les fichiers d'en-tête utilisés par ces exécutables se trouvent (par exemple: Boost :: Program_options, si vous l'utilisez pour analyser les arguments de votre main()
fonction) . Vous utiliseriez probablement le PRIVATE
mot - clé dans ce cas, car ces fichiers sont nécessaires pour compiler l'exécutable lui-même. Je ne sais pas s'il y a une utilisation pour INTERFACE
ou PUBLIC
sur un exécutable, cependant.
Les mots clés INTERFACE, PUBLIC et PRIVATE sont nécessaires pour spécifier la portée des arguments suivants. Les éléments PRIVATE et PUBLIC rempliront la propriété INCLUDE_DIRECTORIES de <target>. Les éléments PUBLIC et INTERFACE rempliront la propriété INTERFACE_INCLUDE_DIRECTORIES de <cible>. Les arguments suivants spécifient les répertoires d'inclusion.
Depuis la documentation: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Pour reformuler la documentation avec mes propres mots: