Dependencias de la interfaz de CMake target_link_libraries

99

Soy nuevo en CMake y estoy un poco confundido con las palabras clave PUBLIC, PRIVATE e INTERFACE relacionadas con target_link_libraries(). La documentación menciona que se pueden utilizar para especificar tanto las dependencias del enlace como la interfaz del enlace en un solo comando.

¿Qué significan realmente las dependencias de enlace y la interfaz de enlace?

Sirish
fuente
1
Pregunta similar: stackoverflow.com/questions/26243169/…
TManhente

Respuestas:

202

Si está creando una biblioteca compartida y sus archivos cpp de origen #incluyen los encabezados de otra biblioteca (digamos, QtNetwork por ejemplo), pero sus archivos de encabezado no incluyen encabezados QtNetwork, entonces QtNetwork es una PRIVATEdependencia.

Si sus archivos de origen y sus encabezados incluyen los encabezados de otra biblioteca, entonces es una PUBLICdependencia.

Si sus archivos de encabezado, pero no sus archivos de origen, incluyen los encabezados de otra biblioteca, entonces es una INTERFACEdependencia.

Otras propiedades de compilación PUBLICy INTERFACEdependencias se propagan a las bibliotecas consumidoras. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements

steveire
fuente
40
Esta es la explicación más clara de esta pregunta que he escuchado. ¡Ojalá la documentación de cmake fuera tan clara! :-)
Ela782
1
Gracias por la explicación, ahora entiendo el significado, pero ¿por qué especificar PUBLICo PRIVATEimporta? ¿Qué cambia?
user3667089
8
El uso PRIVATEno agrega sus dependencias a los proyectos que se vinculan a su biblioteca. Es más limpio y también evita posibles conflictos entre tus dependencias y las de tu usuario.
user2658323
7
@steveire En aras de la claridad, podría valer la pena declarar explícitamente que "incluir" significa inclusión transitiva, no solo inclusión directa. Por ejemplo, si los archivos de encabezado de otra biblioteca solo están incluidos directamente en sus archivos de encabezado, pero todos sus archivos de encabezado están incluidos en sus archivos de origen, entonces sus archivos de origen incluyen de manera transitiva los archivos de encabezado de la otra biblioteca, por lo que tiene una PUBLICdependencia, no una INTERFACEdependencia.
Ose
¡La documentación de cmake debería escribirla tan concisa como esta respuesta!
Bryan Jyh Herng Chong