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?
Respuestas:
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
PRIVATE
dependencia.Si sus archivos de origen y sus encabezados incluyen los encabezados de otra biblioteca, entonces es una
PUBLIC
dependencia.Si sus archivos de encabezado, pero no sus archivos de origen, incluyen los encabezados de otra biblioteca, entonces es una
INTERFACE
dependencia.Otras propiedades de compilación
PUBLIC
yINTERFACE
dependencias se propagan a las bibliotecas consumidoras. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirementsfuente
PUBLIC
oPRIVATE
importa? ¿Qué cambia?PRIVATE
no 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.PUBLIC
dependencia, no unaINTERFACE
dependencia.