2015-08-12 18 views
41

Ho una struttura di directory per il mio codice C++, che va in questo modo:Qual è la differenza tra include_directories e target_include_directories in CMake?

| 
|->include 
|->src 

Sto scrivendo un file CMakeLists.txt per il mio codice. Voglio capire la differenza tra include_directories e target_include_directories in CMake.

Qual è la differenza tra il loro utilizzo e al fine di aggiungere il percorso del file di inclusione che dovrei utilizzare?

+3

Hai letto la documentazione per [ 'include_directories'] (http://www.cmake.org/cmake/help/v3.2/command/include_directories.html) e [' target_include_directories'] (http: //www.cmake.org/cmake/help/v3.2/command/target_include_directories.html)? Che cosa non capisci della differenza tra loro? –

+24

Non c'è chiarezza nella documentazione. L'ho letto e ho ipotizzato ciò che Angew ha scritto nella sua risposta, ma non ci sono descrizioni, esempi e per un sistema che è pensato per la costruzione del progetto, non ci sono esempi di progetti nella documentazione di CMake. Se ci fosse stata una buona e completa documentazione di CMake, non avrei gravato sulla comunità di queste domande. –

risposta

50

include_directories(x/y) riguarda l'ambito della directory. Tutti i target in questa CMakeList, nonché quelli in tutte le sottodirectory aggiunte dopo il punto della sua chiamata, avranno il percorso x/y aggiunto al loro percorso di inclusione.

target_include_directories(t x/y) ha lo scopo di destinazione — aggiunge x/y al percorso di inclusione per il target t.

Si desidera il precedente se tutti i target utilizzano le directory di inclusione in questione. Si desidera quest'ultima se il percorso è specifico per un obiettivo o se si desidera un controllo più preciso della visibilità del percorso. Quest'ultimo deriva dal fatto che lo target_include_directories() supporta i qualificatori PRIVATE, PUBLIC e INTERFACE.

+19

Penso che quest'ultimo dovrebbe generalmente essere preferito (a patto che uno stia usando cmake 3). Ha il vantaggio di mettere '' x/y'' nel percorso di inclusione di tutti i bersagli dipendenti che usano '' t'' nei loro comandi '' target_link_libraries''. Ovviamente c'è un posto per il primo, ma credo che quest'ultimo sia generalmente migliore. – Phil

+1

La risposta originale affermava che saranno interessati solo i bersagli e le sottodirectory dopo "include_directory". Sto modificando la risposta: la documentazione indica chiaramente che * tutti * gli obiettivi nelle attuali CMakeLists sono interessati.La documentazione non menziona ma solo le sottodirectory dopo che la chiamata è interessata (come è stato correttamente affermato nella risposta originale) –

+0

@Phil, 'target_include_directories' è stata introdotta in CMake 2.8.11 (maggio 2013) –

16

accanto a quello che dice Angew's answer correttamente, un'altra importante differenza tra include_directories e target_include_directories è che, quando viene utilizzato con PUBLIC o INTERFACE, quest'ultimo popolano la proprietà INTERFACE_INCLUDE_DIRECTORIES del bersaglio. Questa proprietà è utile quando un'altra destinazione utilizza target_link_libraries per collegarsi alla destinazione originale, poiché la destinazione di collegamento avrà automaticamente quelle incluse directory aggiunte. Vedi example.

Questa importante caratteristica è abbastanza ben nascosto nella documentazione: target_include_directories menzione popolamento INTERFACE_INCLUDE_DIRECTORIES, la cui documentation dice:

Quando dipendenze di destinazione vengono specificati utilizzando target_link_libraries(), CMake leggeranno questo immobile dal tutte le dipendenze di destinazione per determinare le proprietà di costruzione del consumatore.

Problemi correlati