¿Cuál es el significado de la palabra clave PUBLIC
, PRIVATE
y INTERFACE
en relación con CMake de target_include_directories
?
Respuestas:
Estas palabras clave se utilizan para indicar cuándo se necesita la lista de directorios de inclusión que está pasando al destino. Para cuándo , significa si se necesitan directorios de inclusión:
Cuando CMake está compilando un objetivo, que utiliza los objetivos INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
y COMPILE_OPTIONS
propiedades. Cuando usa la PRIVATE
palabra clave in target_include_directories()
y similar, le dice a CMake que complete esas propiedades de destino.
Cuando CMake detecta una dependencia entre un objetivo A y otro objetivo B (como cuando usa el target_link_libraries(A B)
comando), propaga de forma transitiva B
los requisitos de uso al A
objetivo. Los requisitos de uso de destino son los directorios de inclusión, las definiciones de compilación, etc. que B
debe cumplir cualquier destino que dependa . Se especifican mediante la INTERFACE_*
versión de las propiedades enumeradas anteriormente (como INTERFACE_INCLUDE_DIRECTORIES
) y se completan utilizando la INTERFACE
palabra clave al llamar a los target_*()
comandos.
La PUBLIC
palabra clave significa aproximadamente PRIVATE + INTERFACE
.
Por lo tanto, suponga que está creando una biblioteca A
que usa algunos encabezados de Boost. Tu harías:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
si solo usa esos encabezados de Boost dentro de sus archivos de origen ( .cpp
) o archivos de encabezado privados ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
si no usa esos encabezados de Boost dentro de sus archivos fuente (por lo tanto, no los necesita para compilar A
). En realidad, no puedo pensar en un ejemplo del mundo real para esto.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
si usa esos encabezados de Boost en sus archivos de encabezado públicos, que se incluyen AMBOS en algunos de A
los archivos fuente y también pueden estar incluidos en cualquier otro cliente de su A
biblioteca.La documentación de CMake 3.0 tiene más detalles sobre esta especificación de compilación y las propiedades de los requisitos de uso .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Esto significa que dentro de su biblioteca puede incluir archivos directamente, pero como usuario de la biblioteca debe insertar libname/
primero.
target_include_directories()
a un destino ejecutable si necesita establecer directorios de inclusión donde se encuentran los archivos de encabezado que usan esos ejecutables (por ejemplo: Boost :: Program_options, si lo usa para analizar argumentos en su main()
función) . Probablemente usaría la PRIVATE
palabra clave en este caso, ya que estos archivos son necesarios para compilar el ejecutable en sí. Sin embargo, no sé si hay algún uso para INTERFACE
o PUBLIC
en un ejecutable.
Las palabras clave INTERFACE, PUBLIC y PRIVATE son necesarias para especificar el alcance de los siguientes argumentos. Los elementos PRIVADOS y PÚBLICOS poblarán la propiedad INCLUDE_DIRECTORIES de <target>. Los elementos PUBLIC e INTERFACE completarán la propiedad INTERFACE_INCLUDE_DIRECTORIES de <target>. Los siguientes argumentos especifican directorios de inclusión.
De la documentación: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Para reformular la documentación con mis propias palabras: