Qual è il significato della parola chiave PUBLIC
, PRIVATE
e INTERFACE
relativi a CMake di target_include_directories
?
Risposte:
Queste parole chiave vengono utilizzate per sapere quando è necessario l'elenco delle directory di inclusione che stai passando alla destinazione. Entro quando , significa che sono necessarie quelle directory di inclusione:
Quando CMake sta compilando un target, utilizza gli obiettivi INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
e COMPILE_OPTIONS
le proprietà. Quando si utilizza la PRIVATE
parola chiave in target_include_directories()
e simili, si dice a CMake di popolare quelle proprietà di destinazione.
Quando CMake rileva una dipendenza tra una destinazione A e un'altra destinazione B (come quando si utilizza il target_link_libraries(A B)
comando), propaga in modo transitorio i B
requisiti di utilizzo alla A
destinazione. Tali requisiti di utilizzo di destinazione sono le directory di inclusione, le definizioni di compilazione, ecc. Che qualsiasi obiettivo da cui dipende B
deve soddisfare. Sono specificati dalla INTERFACE_*
versione delle proprietà sopra elencate (come INTERFACE_INCLUDE_DIRECTORIES
) e vengono popolati utilizzando la INTERFACE
parola chiave quando si chiamano i target_*()
comandi.
La PUBLIC
parola chiave significa approssimativamente PRIVATE + INTERFACE
.
Supponiamo quindi di creare una libreria A
che utilizzi alcune intestazioni Boost. Faresti:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
se usi solo quelle intestazioni Boost all'interno dei tuoi file sorgente ( .cpp
) o file di intestazione privati ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
se non usi queste intestazioni Boost all'interno dei tuoi file sorgente (quindi, non è necessario che vengano compilate A
). Non riesco a pensare a un esempio del mondo reale per questo.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
se usi queste intestazioni Boost nei tuoi file di intestazione pubblici, che sono inclusi ENTRAMBI in alcuni A
file sorgente di e potrebbero anche essere inclusi in qualsiasi altro client della tua A
libreria.La documentazione di CMake 3.0 contiene maggiori dettagli su questa specifica di build e sulle proprietà dei requisiti di utilizzo .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Ciò significa che all'interno della tua libreria puoi includere file direttamente, ma come utente della libreria devi libname/
prima inserirli .
target_include_directories()
un target eseguibile se devi impostare le directory di inclusione in cui devono essere trovati i file di intestazione utilizzati da quegli eseguibili (ad esempio: Boost :: Program_options, se lo usi per analizzare gli argomenti nella tua main()
funzione) . Probabilmente useresti la PRIVATE
parola chiave in questo caso, poiché questi file sono necessari per compilare l'eseguibile stesso. Non so se ci sia qualche utilità per INTERFACE
o PUBLIC
su un eseguibile, però.
Le parole chiave INTERFACE, PUBLIC e PRIVATE sono necessarie per specificare l'ambito dei seguenti argomenti. Gli elementi PRIVATE e PUBLIC popoleranno la proprietà INCLUDE_DIRECTORIES di <target>. Gli elementi PUBLIC e INTERFACE popoleranno la proprietà INTERFACE_INCLUDE_DIRECTORIES di <target>. I seguenti argomenti specificano le directory include.
Dalla documentazione: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Per riformulare la documentazione con parole mie: