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_directories
y target_include_directories
en CMake
.
¿Cuál es la diferencia entre su uso y para agregar mi ruta de archivo de inclusión cuál debo usar?
include_directories
ytarget_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/y
agregada a su ruta de inclusión.target_include_directories(t x/y)
tiene alcance objetivo: se agregax/y
a 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
,PUBLIC
yINTERFACE
calificadores.fuente
x/y
incluir la ruta de inclusión de cualquier objetivo dependiente que uset
en sustarget_link_libraries
comandos. Por supuesto, hay un lugar para el primero, pero creo que el último es generalmente mejor.include_directories
se 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_directories
se 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_directories
ytarget_include_directories
es que, cuando se usa conPUBLIC
oINTERFACE
, este último llena laINTERFACE_INCLUDE_DIRECTORIES
propiedad del objetivo. Esta propiedad es útil cuando otro objetivo utilizatarget_link_libraries
para 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
PUBLIC
propiedades, 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