|
|
@@ -9,60 +9,49 @@ Link a target to given libraries.
|
|
|
[[debug|optimized|general] <item>] ...)
|
|
|
|
|
|
Specify libraries or flags to use when linking a given target. The
|
|
|
-named <target> must have been created in the current directory by a
|
|
|
-command such as add_executable or add_library. The remaining
|
|
|
-arguments specify library names or flags. Repeated calls for the same
|
|
|
-<target> append items in the order called.
|
|
|
+named ``<target>`` must have been created in the current directory by a
|
|
|
+command such as :command:`add_executable` or :command:`add_library`. The
|
|
|
+remaining arguments specify library names or flags. Repeated calls for
|
|
|
+the same ``<target>`` append items in the order called.
|
|
|
|
|
|
If a library name matches that of another target in the project a
|
|
|
-dependency will automatically be added in the build system to make
|
|
|
-sure the library being linked is up-to-date before the target links.
|
|
|
-Item names starting with '-', but not '-l' or '-framework', are
|
|
|
-treated as linker flags.
|
|
|
+dependency will automatically be added in the build system to make sure
|
|
|
+the library being linked is up-to-date before the target links. Item names
|
|
|
+starting with ``-``, but not ``-l`` or ``-framework``, are treated as
|
|
|
+linker flags.
|
|
|
|
|
|
-A "debug", "optimized", or "general" keyword indicates that the
|
|
|
+A ``debug``, ``optimized``, or ``general`` keyword indicates that the
|
|
|
library immediately following it is to be used only for the
|
|
|
-corresponding build configuration. The "debug" keyword corresponds to
|
|
|
+corresponding build configuration. The ``debug`` keyword corresponds to
|
|
|
the Debug configuration (or to configurations named in the
|
|
|
-DEBUG_CONFIGURATIONS global property if it is set). The "optimized"
|
|
|
-keyword corresponds to all other configurations. The "general"
|
|
|
-keyword corresponds to all configurations, and is purely optional
|
|
|
-(assumed if omitted). Higher granularity may be achieved for
|
|
|
-per-configuration rules by creating and linking to IMPORTED library
|
|
|
-targets. See the IMPORTED mode of the add_library command for more
|
|
|
-information.
|
|
|
+:prop_gbl:`DEBUG_CONFIGURATIONS` global property if it is set). The
|
|
|
+``optimized`` keyword corresponds to all other configurations. The
|
|
|
+``general`` keyword corresponds to all configurations, and is purely
|
|
|
+optional (assumed if omitted). Higher granularity may be achieved for
|
|
|
+per-configuration rules by creating and linking to
|
|
|
+:ref:`IMPORTED library targets <Imported Targets>`.
|
|
|
|
|
|
Library dependencies are transitive by default with this signature.
|
|
|
When this target is linked into another target then the libraries
|
|
|
linked to this target will appear on the link line for the other
|
|
|
target too. This transitive "link interface" is stored in the
|
|
|
-INTERFACE_LINK_LIBRARIES target property when policy CMP0022 is set to
|
|
|
-NEW and may be overridden by setting the property directly.
|
|
|
-(When CMP0022 is not set to NEW, transitive linking is builtin but may
|
|
|
-be overridden by the LINK_INTERFACE_LIBRARIES property. Calls to other
|
|
|
-signatures of this command may set the property making any libraries
|
|
|
-linked exclusively by this signature private.)
|
|
|
-
|
|
|
-CMake will also propagate "usage requirements" from linked library
|
|
|
-targets. Usage requirements affect compilation of sources in the
|
|
|
-<target>. They are specified by properties defined on linked targets.
|
|
|
-During generation of the build system, CMake integrates usage
|
|
|
-requirement property values with the corresponding build properties
|
|
|
-for <target>:
|
|
|
-
|
|
|
-::
|
|
|
-
|
|
|
- INTERFACE_COMPILE_DEFINITONS: Appends to COMPILE_DEFINITONS
|
|
|
- INTERFACE_INCLUDE_DIRECTORIES: Appends to INCLUDE_DIRECTORIES
|
|
|
- INTERFACE_POSITION_INDEPENDENT_CODE: Sets POSITION_INDEPENDENT_CODE
|
|
|
- or checked for consistency with existing value
|
|
|
+:prop_tgt:`INTERFACE_LINK_LIBRARIES` target property and may be overridden
|
|
|
+by setting the property directly. When :policy:`CMP0022` is not set to
|
|
|
+``NEW``, transitive linking is built in but may be overridden by the
|
|
|
+:prop_tgt:`LINK_INTERFACE_LIBRARIES` property. Calls to other signatures
|
|
|
+of this command may set the property making any libraries linked
|
|
|
+exclusively by this signature private.
|
|
|
|
|
|
+CMake will also propagate :ref:`usage requirements <Target Usage Requirements>`
|
|
|
+from linked library targets. Usage requirements of dependencies affect
|
|
|
+compilation of sources in the ``<target>``.
|
|
|
|
|
|
+If an ``<item>`` is a library in a Mac OX framework, the ``Headers``
|
|
|
+directory of the framework will also be processed as a
|
|
|
+:ref:`usage requirement <Target Usage Requirements>`. This has the same
|
|
|
+effect as passing the framework directory as an include directory.
|
|
|
|
|
|
-If an <item> is a library in a Mac OX framework, the Headers directory
|
|
|
-of the framework will also be processed as a "usage requirement".
|
|
|
-This has the same effect as passing the framework directory as an
|
|
|
-include directory.
|
|
|
+--------------------------------------------------------------------------
|
|
|
|
|
|
::
|
|
|
|
|
|
@@ -70,34 +59,44 @@ include directory.
|
|
|
<PRIVATE|PUBLIC|INTERFACE> <lib> ...
|
|
|
[<PRIVATE|PUBLIC|INTERFACE> <lib> ... ] ...])
|
|
|
|
|
|
-The PUBLIC, PRIVATE and INTERFACE keywords can be used to specify both
|
|
|
-the link dependencies and the link interface in one command.
|
|
|
-Libraries and targets following PUBLIC are linked to, and are made
|
|
|
-part of the link interface. Libraries and targets following PRIVATE
|
|
|
+The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE`` keywords can be used to
|
|
|
+specify both the link dependencies and the link interface in one command.
|
|
|
+Libraries and targets following ``PUBLIC`` are linked to, and are made
|
|
|
+part of the link interface. Libraries and targets following ``PRIVATE``
|
|
|
are linked to, but are not made part of the link interface. Libraries
|
|
|
-following INTERFACE are appended to the link interface and are not
|
|
|
-used for linking <target>.
|
|
|
+following ``INTERFACE`` are appended to the link interface and are not
|
|
|
+used for linking ``<target>``.
|
|
|
+
|
|
|
+--------------------------------------------------------------------------
|
|
|
|
|
|
::
|
|
|
|
|
|
target_link_libraries(<target> LINK_INTERFACE_LIBRARIES
|
|
|
[[debug|optimized|general] <lib>] ...)
|
|
|
|
|
|
-The LINK_INTERFACE_LIBRARIES mode appends the libraries to the
|
|
|
-INTERFACE_LINK_LIBRARIES target property instead of using them for
|
|
|
-linking. If policy CMP0022 is not NEW, then this mode also appends
|
|
|
-libraries to the LINK_INTERFACE_LIBRARIES and its per-configuration
|
|
|
-equivalent. This signature is for compatibility only. Prefer the
|
|
|
-INTERFACE mode instead. Libraries specified as "debug" are wrapped in
|
|
|
-a generator expression to correspond to debug builds. If policy
|
|
|
-CMP0022 is not NEW, the libraries are also appended to the
|
|
|
-LINK_INTERFACE_LIBRARIES_DEBUG property (or to the properties
|
|
|
-corresponding to configurations listed in the DEBUG_CONFIGURATIONS
|
|
|
-global property if it is set). Libraries specified as "optimized" are
|
|
|
-appended to the INTERFACE_LINK_LIBRARIES property. If policy CMP0022
|
|
|
-is not NEW, they are also appended to the LINK_INTERFACE_LIBRARIES
|
|
|
-property. Libraries specified as "general" (or without any keyword)
|
|
|
-are treated as if specified for both "debug" and "optimized".
|
|
|
+The ``LINK_INTERFACE_LIBRARIES`` mode appends the libraries to the
|
|
|
+:prop_tgt:`INTERFACE_LINK_LIBRARIES` target property instead of using them
|
|
|
+for linking. If policy :policy:`CMP0022` is not ``NEW``, then this mode
|
|
|
+also appends libraries to the :prop_tgt:`LINK_INTERFACE_LIBRARIES` and its
|
|
|
+per-configuration equivalent.
|
|
|
+
|
|
|
+This signature is for compatibility only. Prefer the ``INTERFACE`` mode
|
|
|
+instead.
|
|
|
+
|
|
|
+Libraries specified as ``debug`` are wrapped in a generator expression to
|
|
|
+correspond to debug builds. If policy :policy:`CMP0022` is
|
|
|
+not ``NEW``, the libraries are also appended to the
|
|
|
+:prop_tgt:`LINK_INTERFACE_LIBRARIES_DEBUG <LINK_INTERFACE_LIBRARIES_<CONFIG>>`
|
|
|
+property (or to the properties corresponding to configurations listed in
|
|
|
+the :prop_gbl:`DEBUG_CONFIGURATIONS` global property if it is set).
|
|
|
+Libraries specified as ``optimized`` are appended to the
|
|
|
+:prop_tgt:`INTERFACE_LINK_LIBRARIES` property. If policy :policy:`CMP0022`
|
|
|
+is not ``NEW``, they are also appended to the
|
|
|
+:prop_tgt:`LINK_INTERFACE_LIBRARIES` property. Libraries specified as
|
|
|
+``general`` (or without any keyword) are treated as if specified for both
|
|
|
+``debug`` and ``optimized``.
|
|
|
+
|
|
|
+--------------------------------------------------------------------------
|
|
|
|
|
|
::
|
|
|
|
|
|
@@ -107,23 +106,26 @@ are treated as if specified for both "debug" and "optimized".
|
|
|
[<LINK_PRIVATE|LINK_PUBLIC>
|
|
|
[[debug|optimized|general] <lib>] ...])
|
|
|
|
|
|
-The LINK_PUBLIC and LINK_PRIVATE modes can be used to specify both the
|
|
|
-link dependencies and the link interface in one command. This
|
|
|
-signature is for compatibility only. Prefer the PUBLIC or PRIVATE
|
|
|
-keywords instead. Libraries and targets following LINK_PUBLIC are
|
|
|
-linked to, and are made part of the INTERFACE_LINK_LIBRARIES. If
|
|
|
-policy CMP0022 is not NEW, they are also made part of the
|
|
|
-LINK_INTERFACE_LIBRARIES. Libraries and targets following
|
|
|
-LINK_PRIVATE are linked to, but are not made part of the
|
|
|
-INTERFACE_LINK_LIBRARIES (or LINK_INTERFACE_LIBRARIES).
|
|
|
-
|
|
|
-The library dependency graph is normally acyclic (a DAG), but in the
|
|
|
-case of mutually-dependent STATIC libraries CMake allows the graph to
|
|
|
-contain cycles (strongly connected components). When another target
|
|
|
-links to one of the libraries CMake repeats the entire connected
|
|
|
-component. For example, the code
|
|
|
+The ``LINK_PUBLIC`` and ``LINK_PRIVATE`` modes can be used to specify both
|
|
|
+the link dependencies and the link interface in one command.
|
|
|
|
|
|
-::
|
|
|
+This signature is for compatibility only. Prefer the ``PUBLIC`` or
|
|
|
+``PRIVATE`` keywords instead.
|
|
|
+
|
|
|
+Libraries and targets following ``LINK_PUBLIC`` are linked to, and are
|
|
|
+made part of the :prop_tgt:`INTERFACE_LINK_LIBRARIES`. If policy
|
|
|
+:policy:`CMP0022` is not ``NEW``, they are also made part of the
|
|
|
+:prop_tgt:`LINK_INTERFACE_LIBRARIES`. Libraries and targets following
|
|
|
+``LINK_PRIVATE`` are linked to, but are not made part of the
|
|
|
+:prop_tgt:`INTERFACE_LINK_LIBRARIES` (or :prop_tgt:`LINK_INTERFACE_LIBRARIES`).
|
|
|
+
|
|
|
+The library dependency graph is normally acyclic (a DAG), but in the case
|
|
|
+of mutually-dependent ``STATIC`` libraries CMake allows the graph to
|
|
|
+contain cycles (strongly connected components). When another target links
|
|
|
+to one of the libraries, CMake repeats the entire connected component.
|
|
|
+For example, the code
|
|
|
+
|
|
|
+.. code-block:: cmake
|
|
|
|
|
|
add_library(A STATIC a.c)
|
|
|
add_library(B STATIC b.c)
|
|
|
@@ -132,15 +134,16 @@ component. For example, the code
|
|
|
add_executable(main main.c)
|
|
|
target_link_libraries(main A)
|
|
|
|
|
|
-links 'main' to 'A B A B'. (While one repetition is usually
|
|
|
-sufficient, pathological object file and symbol arrangements can
|
|
|
-require more. One may handle such cases by manually repeating the
|
|
|
-component in the last target_link_libraries call. However, if two
|
|
|
-archives are really so interdependent they should probably be combined
|
|
|
-into a single archive.)
|
|
|
+links ``main`` to ``A B A B``. While one repetition is usually
|
|
|
+sufficient, pathological object file and symbol arrangements can require
|
|
|
+more. One may handle such cases by manually repeating the component in
|
|
|
+the last ``target_link_libraries`` call. However, if two archives are
|
|
|
+really so interdependent they should probably be combined into a single
|
|
|
+archive.
|
|
|
|
|
|
Arguments to target_link_libraries may use "generator expressions"
|
|
|
with the syntax ``$<...>``. Note however, that generator expressions
|
|
|
-will not be used in OLD handling of CMP0003 or CMP0004.
|
|
|
+will not be used in OLD handling of :policy:`CMP0003` or :policy:`CMP0004`.
|
|
|
See the :manual:`cmake-generator-expressions(7)` manual for available
|
|
|
-expressions.
|
|
|
+expressions. See the :manual:`cmake-buildsystem(7)` manual for more on
|
|
|
+defining buildsystem properties.
|