CMake target_include_directories significato dell'ambito


Risposte:


124

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:

  • Per compilare quell'obiettivo stesso.
  • Per compilare altri target che dipendono da quel target (come l'utilizzo delle sue intestazioni pubbliche).
  • In entrambe le situazioni di cui sopra.

Quando CMake sta compilando un target, utilizza gli obiettivi INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSe COMPILE_OPTIONSle proprietà. Quando si utilizza la PRIVATEparola 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 Adestinazione. Tali requisiti di utilizzo di destinazione sono le directory di inclusione, le definizioni di compilazione, ecc. Che qualsiasi obiettivo da cui dipende Bdeve soddisfare. Sono specificati dalla INTERFACE_*versione delle proprietà sopra elencate (come INTERFACE_INCLUDE_DIRECTORIES) e vengono popolati utilizzando la INTERFACEparola chiave quando si chiamano i target_*()comandi.

La PUBLICparola chiave significa approssimativamente PRIVATE + INTERFACE.

Supponiamo quindi di creare una libreria Ache 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 Afile sorgente di e potrebbero anche essere inclusi in qualsiasi altro client della tua Alibreria.

La documentazione di CMake 3.0 contiene maggiori dettagli su questa specifica di build e sulle proprietà dei requisiti di utilizzo .


18
Per quanto riguarda un esempio del mondo reale di 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 .
KaareZ

2
Questa risposta ha senso per me per la creazione di librerie. Ma che ne dici di chiamare target_include_directories per un target che è un eseguibile?
Norman Pellet

1
@ NormanPellet: puoi chiamare 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 PRIVATEparola chiave in questo caso, poiché questi file sono necessari per compilare l'eseguibile stesso. Non so se ci sia qualche utilità per INTERFACEo PUBLICsu un eseguibile, però.
TManhente

13

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:

  • si desidera aggiungere una directory all'elenco di directory di inclusione per una destinazione
  • con PRIVATE la directory viene aggiunta alle directory include del target
  • con INTERFACE il target non viene modificato, ma INTERFACE_INCLUDE_DIRECTORIES viene esteso dalla directory. La variabile è un elenco di directory di inclusione pubbliche per una libreria.
  • con PUBLIC vengono eseguite sia le azioni da PRIVATO che da INTERFACCIA.

5
Ho esaminato la documentazione di CMAKE, ma non ho ancora capito cosa significano effettivamente e in quale contesto (creare file o come sono stati compilati)?
Sirish

@ Sirish: ho provato a riformulare la documentazione, spero che aiuti.
usr1234567
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.