Enlaza un objetivo con las bibliotecas dadas.
target_link_libraries(<target> ]] <item>] ...)
Especifica las bibliotecas o banderas a utilizar al enlazar un objetivo dado. El nombre <target>
debe haber sido creado en el directorio actual por un comando como add_executable()
o add_library()
. Los argumentos restantes especifican nombres de bibliotecas o banderas. Las llamadas repetidas al mismo <target>
añaden elementos en el orden de llamada.
Si el nombre de una biblioteca coincide con el de otro objetivo en el proyecto, se añadirá automáticamente una dependencia en el sistema de compilación para asegurarse de que la biblioteca que se está enlazando está actualizada antes de que se enlace el objetivo. Los nombres de elementos que comienzan con -
, pero no con -l
o -framework
, se tratan como banderas de enlace.
Una palabra clave debug
, optimized
o general
indica que la biblioteca que le sigue inmediatamente se debe utilizar sólo para la configuración de construcción correspondiente. La palabra clave debug
corresponde a la configuración de depuración (o a las configuraciones nombradas en la propiedad globalDEBUG_CONFIGURATIONS
si está establecida). La palabra claveoptimized
corresponde a todas las demás configuraciones. La palabra clavegeneral
corresponde a todas las configuraciones, y es puramente opcional (se asume si se omite). Se puede lograr una mayor granularidad para las reglas por configuración creando y enlazando con objetivos de bibliotecaIMPORTED.
Las dependencias de las bibliotecas son transitivas por defecto con esta firma.Cuando este objetivo se enlaza con otro objetivo entonces las bibliotecasenlazadas a este objetivo aparecerán en la línea de enlace para el otro objetivo también. Esta «interfaz de enlace» transitiva se almacena en la propiedad INTERFACE_LINK_LIBRARIES
del objetivo y puede anularse estableciendo la propiedad directamente. Cuando CMP0022
no se establece enNEW
, el enlace transitivo está incorporado pero puede ser anulado por la propiedadLINK_INTERFACE_LIBRARIES
. Las llamadas a otras firmas de este comando pueden establecer la propiedad haciendo que cualquier biblioteca vinculada exclusivamente por esta firma sea privada.
CMake también propagará los requisitos de uso de los objetivos de las bibliotecas vinculadas. Los requisitos de uso de las dependencias afectan a la compilación de las fuentes en el <target>
.
Si un <item>
es una biblioteca en un framework de Mac OX, el directorio Headers
del framework también se procesará como requisito de auscultación. Esto tiene el mismo efecto que pasar el directorio del framework como un directorio de inclusión.
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <lib> ... ...])
Las palabras clave PUBLIC
, PRIVATE
y INTERFACE
pueden utilizarse para especificar tanto las dependencias de enlace como la interfaz de enlace en un solo comando.Las bibliotecas y los objetivos que siguen a PUBLIC
se enlazan y forman parte de la interfaz de enlace. Las bibliotecas y los objetivos que siguen a PRIVATE
están vinculados, pero no forman parte de la interfaz de enlace. Las bibliotecas que siguen a INTERFACE
se añaden a la interfaz de enlace y no se utilizan para enlazar <target>
.
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <lib>] ...)
El modo LINK_INTERFACE_LIBRARIES
añade las bibliotecas a la propiedad de destinoINTERFACE_LINK_LIBRARIES
en lugar de utilizarlas para el enlace. Si la política CMP0022
no es NEW
, este modo también anexa las bibliotecas a la propiedad LINK_INTERFACE_LIBRARIES
y su equivalente de configuración.
Esta firma es sólo por compatibilidad. Prefiera el modo INTERFACE
en su lugar.
Las bibliotecas especificadas como debug
se envuelven en una expresión del generador para corresponder a las construcciones de depuración. Si la política CMP0022
no es NEW
, las bibliotecas también se añaden a la propiedadLINK_INTERFACE_LIBRARIES_DEBUG
(o a las propiedades correspondientes a las configuraciones enumeradas en la propiedad global DEBUG_CONFIGURATIONS
si está establecida).Las bibliotecas especificadas como optimized
se añaden a la propiedadINTERFACE_LINK_LIBRARIES
. Si la política CMP0022
no es NEW
, también se añaden a la propiedadLINK_INTERFACE_LIBRARIES
. Las bibliotecas especificadas comogeneral
(o sin ninguna palabra clave) se tratan como si se hubieran especificado tanto para debug
como para optimized
.
target_link_libraries(<target> <LINK_PRIVATE|LINK_PUBLIC> <lib>] ... <lib>] ...])
Los modos LINK_PUBLIC
y LINK_PRIVATE
pueden utilizarse para especificar tanto las dependencias de enlace como la interfaz de enlace en un solo comando.
Esta firma es sólo por compatibilidad. Prefiera las palabras clave PUBLIC
oPRIVATE
en su lugar.
Las bibliotecas y los objetivos que siguen a LINK_PUBLIC
están enlazados y forman parte de INTERFACE_LINK_LIBRARIES
. Si la políticaCMP0022
no es NEW
, también forman parte de LINK_INTERFACE_LIBRARIES
. Las bibliotecas y los objetivos que siguen a LINK_PRIVATE
se enlazan, pero no forman parte de INTERFACE_LINK_LIBRARIES
(o LINK_INTERFACE_LIBRARIES
).
El gráfico de dependencia de las bibliotecas es normalmente acíclico (un DAG), pero en el caso de las bibliotecas STATIC
mutuamente dependientes, CMake permite que el gráfico contenga ciclos (componentes fuertemente conectados). Por ejemplo, el código
add_library(A STATIC a.c)add_library(B STATIC b.c)target_link_libraries(A B)target_link_libraries(B A)add_executable(main main.c)target_link_libraries(main A)
enlaza main
con A B A B
. Aunque una repetición suele ser suficiente, los archivos de objetos patológicos y las disposiciones de símbolos pueden requerir más. Uno puede manejar estos casos repitiendo manualmente el componente en la última llamada target_link_libraries
. Sin embargo, si dos archivos son realmente tan interdependientes, probablemente deberían combinarse en un único archivo.
Los argumentos para target_link_libraries pueden utilizar «expresiones generadoras» con la sintaxis $<...>
. Tenga en cuenta, sin embargo, que las expresiones generadoras no se utilizarán en el manejo OLD de CMP0003
o CMP0004
.Consulte el manual cmake-generator-expressions(7)
para conocer las expresiones disponibles. Consulte el manual cmake-buildsystem(7)
para obtener más información sobre la definición de las propiedades del sistema de construcción.
Deja una respuesta