Tengo una estructura de directorio para mi código C ++ que es así:
|
|->include
|->src
Estoy escribiendo un archivo CMakeLists.txt para mi código. Quiero entender la diferencia entre include_directoriesy target_include_directoriesen CMake.
¿Cuál es la diferencia entre su uso y para agregar mi ruta de archivo de inclusión cuál debo usar?

include_directoriesytarget_include_directories? ¿Qué es lo que no entiendes sobre la diferencia entre ellos?Respuestas:
include_directories(x/y)afecta el alcance del directorio. Todos los objetivos en esta CMakeList, así como aquellos en todos los subdirectorios agregados después del punto de su llamada, tendrán la rutax/yagregada a su ruta de inclusión.target_include_directories(t x/y)tiene alcance objetivo: se agregax/ya la ruta de inclusión para el objetivot.Desea el primero si todos sus objetivos usan los directorios de inclusión en cuestión. Desea el último si la ruta es específica de un objetivo, o si desea un control más preciso de la visibilidad de la ruta. Este último viene del hecho de que
target_include_directories()es compatible con losPRIVATE,PUBLICyINTERFACEcalificadores.fuente
x/yincluir la ruta de inclusión de cualquier objetivo dependiente que useten sustarget_link_librariescomandos. Por supuesto, hay un lugar para el primero, pero creo que el último es generalmente mejor.include_directoriesse verán afectados. Estoy editando la respuesta: la documentación indica claramente que todos los objetivos en las CMakeLists actuales están afectados. La documentación no menciona pero solo subdirece después de que la llamada se ve afectada (como se indicó correctamente en la respuesta original)target_include_directoriesse introdujo en CMake 2.8.11 (mayo de 2013)Además de lo que dice correctamente la respuesta de Angew , otra diferencia muy importante entre
include_directoriesytarget_include_directorieses que, cuando se usa conPUBLICoINTERFACE, este último llena laINTERFACE_INCLUDE_DIRECTORIESpropiedad del objetivo. Esta propiedad es útil cuando otro objetivo utilizatarget_link_librariespara vincular al objetivo original, ya que el objetivo de vinculación tendrá automáticamente los directorios de inclusión agregados. Ver ejemplo .Esta característica importante está bastante bien oculta en la documentación: target_include_directories menciona la población
INTERFACE_INCLUDE_DIRECTORIES, cuya documentación dice:fuente
PUBLICpropiedades, etc.! Gracias: DComo dijo @Angew, la diferencia es:
1, include_directories () es accesible para todos los archivos en el árbol de origen 2, target_include_directories () es accesible solo para un destino específico cuando se compila.
fuente