Qual è il significato della parola chiave PUBLIC
, PRIVATE
e INTERFACE
correlata a target_include_directories
di CMake?CMake target_include_directories significato di scope
risposta
Queste parole chiave vengono utilizzati per raccontare quando l'elenco dei includono directory si sta passando al bersaglio sono necessari. Con quando, significa che se coloro che comprendono sono necessari directory:
- Per compilare che si bersaglio.
- Per compilare altri target che dipendono da tale destinazione (come l'utilizzo delle intestazioni pubbliche).
- In entrambe le situazioni precedenti.
Quando CMake è la compilazione di un target, utilizza gli obiettivi INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
e COMPILE_OPTIONS
proprietà. Quando si utilizza la parola chiave PRIVATE
in target_include_directories()
e allo stesso modo, si comunica a CMake di popolare le proprietà di destinazione.
Quando CMake rileva una dipendenza tra un obiettivo A e un altro bersaglio B (come quando si utilizza il comando target_link_libraries(A B)
), si propaga transitivamente B
requisiti di utilizzo al A
bersaglio. I requisiti di utilizzo del target sono le directory di inclusione, le definizioni di compilazione, ecc. Che ogni target che dipende da B
deve soddisfare. Sono specificati dalla versione INTERFACE_*
delle proprietà elencate in precedenza (come INTERFACE_INCLUDE_DIRECTORIES
) e vengono popolate utilizzando la parola chiave INTERFACE
quando si chiamano i comandi target_*()
.
La parola chiave PUBLIC
indica circa PRIVATE + INTERFACE
.
Pertanto, supponiamo di creare una libreria A
che utilizza alcune intestazioni Boost. Si potrebbe fare:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
se si utilizzano solo le intestazioni Boost dentro i file sorgente (.cpp
) o file di intestazione private (.h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
se non si utilizzano le intestazioni Boost nei file di origine (quindi, non è necessario compilareA
). Non riesco a pensare a un esempio reale per questo.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
se si utilizzano le intestazioni Boost nei file di intestazione pubblici, che sono inclusi ENTRAMBI in alcuni dei file di origine diA
e potrebbero anche essere inclusi in qualsiasi altro client della libreriaA
.
La documentazione di CMake 3.0 contiene ulteriori dettagli su questa proprietà build specification and usage requirements.
Per quanto riguarda un esempio di "INTERFACCIA" reale. 'target_include_directories (l'INTERFACE di libname include PRIVATE include/libname)'. Ciò significa che all'interno della tua libreria puoi includere direttamente i file, ma come utente della libreria devi prima inserire 'libname /'. – KaareZ
Le parole chiave INTERFACE, PUBLIC e PRIVATE sono necessarie per specificare l'ambito dei seguenti argomenti. Gli articoli PRIVATI e PUBBLICI corrisponderanno a nella proprietà INCLUDE_DIRECTORIES di < destinazione>. PUBLIC e Gli elementi INTERFACE popoleranno la proprietà INTERFACE_INCLUDE_DIRECTORIES del target <>. I seguenti argomenti specificati includono le directory .
Dalla documentazione: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
di riformulare la documentazione con le mie stesse parole:
- si desidera aggiungere una directory alla lista delle directory include per un target
- con privata la directory viene aggiunta alle directory di inclusione della destinazione
- con INTERFACE la destinazione non viene modificata, ma INTERFACE_INCLUDE_DIRECTORIES viene estesa da la directory. La variabile è un elenco di directory di inclusione pubbliche per una libreria.
- con PUBLIC vengono eseguite entrambe le azioni da PRIVATO e INTERFACCIA.
Ho esaminato la documentazione di CMAKE, ma non ho ancora ottenuto cosa significano realmente e in quale contesto (creare file o come sono stati compilati) ? – Poorna
@Sirish: ho provato a riformulare la documentazione, spero che sia d'aiuto. – usr1234567
- 1. Qual è la differenza tra include_directories e target_include_directories in CMake?
- 2. Significato "scope" in D (per un parametro)
- 3. VB.NET Per funzione di ciclo scope vs scope scope
- 4. destroy scope/child scope on scope destroy
- 5. Angularjs: $ scope vs scope
- 6. Jersey @ scope scope
- 7. $ scope. $ EvalAsync vs $ scope. $ ApplyAsync
- 8. Laravel Blade @ scope variabile scope
- 9. Elenco ricorsivo di LINK_LIBRARIES in CMake
- 10. CMake verifica una libreria, problema di localizzazione dell'intestazione
- 11. CMake ... ccmake o cmake?
- 12. significato di sottolineatura su iniettabili in angolare
- 13. significato di @ (#) caratteri
- 14. Significato di "." in printf
- 15. Significato di !! javascript
- 16. funzione di richiamata significato
- 17. (python) significato di st_mode
- 18. Il significato di "EiC"
- 19. Significato di {*; } In ProGuard
- 20. Compilazione di $ scope usando .getJSON()
- 21. cmake errore di compilazione
- 22. Problema di collegamento CMake
- 23. La dipendenza transitiva Maven ha scope scope quando la dipendenza ha fornito scope
- 24. Come compilare CMake per ARM con CMake
- 25. CMake può generare script di compilazione che * non * usano cmake?
- 26. cosa non ha scope scope e quando usarlo?
- 27. JavaScript: riferimento a scope scope locale delle funzioni come oggetto
- 28. significato di m34 di CATransform3D
- 29. JSF CDI: best practice per scope scope [s]
- 30. In strato SpringMVC Controller, @Scope ("prototipo") vs @Scope ("Singleton")
Strettamente correlato: http://stackoverflow.com/q/26037954/3425536 – emlai