2014-10-07 11 views

risposta

38

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 Brequisiti 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 compilare A). 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 di A e potrebbero anche essere inclusi in qualsiasi altro client della libreria A.

La documentazione di CMake 3.0 contiene ulteriori dettagli su questa proprietà build specification and usage requirements.

+0

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

8

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.
+3

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

+0

@Sirish: ho provato a riformulare la documentazione, spero che sia d'aiuto. – usr1234567