¿Cuál es la diferencia entre include_directories y target_include_directories en CMake?

¿Cuál es la diferencia entre include_directories y target_include_directories en CMake?

include_directories(x/y) afecta el alcance del directorio. Todos los objetivos de esta CMakeList, así como los de todos los subdirectorios agregados después del punto de su llamada, tendrán la ruta x/y agregado a su ruta de inclusión.

target_include_directories(t x/y) tiene alcance objetivo:agrega x/y a la ruta de inclusión para el destino t .

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 para un objetivo, o si desea un control más preciso de la visibilidad de la ruta. Este último proviene del hecho de que target_include_directories() soporta el PRIVATE , PUBLIC y INTERFACE calificadores.


Además de lo que dice correctamente la respuesta de Angew, otra diferencia muy importante entre include_directories y target_include_directories es que, cuando se usa con PUBLIC o INTERFACE , este último completa el INTERFACE_INCLUDE_DIRECTORIES propiedad del objetivo. Esta propiedad es útil cuando otro objetivo usa target_link_libraries para vincular al destino original, ya que el destino de vinculación tendrá automáticamente esos directorios incluidos agregados. Ver ejemplo.

Esta característica importante está bastante bien escondida en la documentación:target_include_directories menciona poblar INTERFACE_INCLUDE_DIRECTORIES , cuya documentación dice:


Como dijo @Angew, la gran diferencia es:

1, include_directories() es accesible para todos los archivos en source-tree2, target_include_directories() solo es accesible para un destino específico cuando se compila.