| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 | 
							- target_link_libraries
 
- ---------------------
 
- .. only:: html
 
-    .. contents::
 
- Specify libraries or flags to use when linking a given target and/or
 
- its dependents.  :ref:`Usage requirements <Target Usage Requirements>`
 
- from linked library targets will be propagated.  Usage requirements
 
- of a target's dependencies affect compilation of its own sources.
 
- Overview
 
- ^^^^^^^^
 
- This command has several signatures as detailed in subsections below.
 
- All of them have the general form
 
- .. code-block:: cmake
 
-   target_link_libraries(<target> ... <item>... ...)
 
- The named ``<target>`` must have been created by a command such as
 
- :command:`add_executable` or :command:`add_library` and must not be an
 
- :ref:`ALIAS target <Alias Targets>`.  If policy :policy:`CMP0079` is not
 
- set to ``NEW`` then the target must have been created in the current
 
- directory.  Repeated calls for the same ``<target>`` append items in
 
- the order called.
 
- .. versionadded:: 3.13
 
-   The ``<target>`` doesn't have to be defined in the same directory as the
 
-   ``target_link_libraries`` call.
 
- Each ``<item>`` may be:
 
- * **A library target name**: The generated link line will have the
 
-   full path to the linkable library file associated with the target.
 
-   The buildsystem will have a dependency to re-link ``<target>`` if
 
-   the library file changes.
 
-   The named target must be created by :command:`add_library` within
 
-   the project or as an :ref:`IMPORTED library <Imported Targets>`.
 
-   If it is created within the project an ordering dependency will
 
-   automatically be added in the build system to make sure the named
 
-   library target is up-to-date before the ``<target>`` links.
 
-   If an imported library has the :prop_tgt:`IMPORTED_NO_SONAME`
 
-   target property set, CMake may ask the linker to search for
 
-   the library instead of using the full path
 
-   (e.g. ``/usr/lib/libfoo.so`` becomes ``-lfoo``).
 
-   The full path to the target's artifact will be quoted/escaped for
 
-   the shell automatically.
 
- * **A full path to a library file**: The generated link line will
 
-   normally preserve the full path to the file. The buildsystem will
 
-   have a dependency to re-link ``<target>`` if the library file changes.
 
-   There are some cases where CMake may ask the linker to search for
 
-   the library (e.g. ``/usr/lib/libfoo.so`` becomes ``-lfoo``), such
 
-   as when a shared library is detected to have no ``SONAME`` field.
 
-   See policy :policy:`CMP0060` for discussion of another case.
 
-   If the library file is in a macOS 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.
 
-   .. versionadded:: 3.28
 
-     The library file may point to a ``.xcframework`` folder on Apple platforms.
 
-     If it does, the target will get the selected library's ``Headers``
 
-     directory as a usage requirement.
 
-   .. versionadded:: 3.8
 
-     On :ref:`Visual Studio Generators` for VS 2010 and above, library files
 
-     ending in ``.targets`` will be treated as MSBuild targets files and
 
-     imported into generated project files.  This is not supported by other
 
-     generators.
 
-   The full path to the library file will be quoted/escaped for
 
-   the shell automatically.
 
- * **A plain library name**: The generated link line will ask the linker
 
-   to search for the library (e.g. ``foo`` becomes ``-lfoo`` or ``foo.lib``).
 
-   The library name/flag is treated as a command-line string fragment and
 
-   will be used with no extra quoting or escaping.
 
- * **A link flag**: Item names starting with ``-``, but not ``-l`` or
 
-   ``-framework``, are treated as linker flags.  Note that such flags will
 
-   be treated like any other library link item for purposes of transitive
 
-   dependencies, so they are generally safe to specify only as private link
 
-   items that will not propagate to dependents.
 
-   Link flags specified here are inserted into the link command in the same
 
-   place as the link libraries. This might not be correct, depending on
 
-   the linker. Use the :prop_tgt:`LINK_OPTIONS` target property or
 
-   :command:`target_link_options` command to add link
 
-   flags explicitly. The flags will then be placed at the toolchain-defined
 
-   flag position in the link command.
 
-   .. versionadded:: 3.13
 
-     :prop_tgt:`LINK_OPTIONS` target property and :command:`target_link_options`
 
-     command.  For earlier versions of CMake, use :prop_tgt:`LINK_FLAGS`
 
-     property instead.
 
-   The link flag is treated as a command-line string fragment and
 
-   will be used with no extra quoting or escaping.
 
- * **A generator expression**: A ``$<...>`` :manual:`generator expression
 
-   <cmake-generator-expressions(7)>` may evaluate to any of the above
 
-   items or to a :ref:`semicolon-separated list <CMake Language Lists>` of them.
 
-   If the ``...`` contains any ``;`` characters, e.g. after evaluation
 
-   of a ``${list}`` variable, be sure to use an explicitly quoted
 
-   argument ``"$<...>"`` so that this command receives it as a
 
-   single ``<item>``.
 
-   Additionally, a generator expression may be used as a fragment of
 
-   any of the above items, e.g. ``foo$<1:_d>``.
 
-   Note that generator expressions will not be used in OLD handling of
 
-   policy :policy:`CMP0003` or policy :policy:`CMP0004`.
 
- * A ``debug``, ``optimized``, or ``general`` keyword immediately followed
 
-   by another ``<item>``.  The item following such a keyword will be used
 
-   only for the corresponding build configuration.  The ``debug`` keyword
 
-   corresponds to the ``Debug`` configuration (or to configurations named
 
-   in the :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.  Higher granularity may be achieved for per-configuration
 
-   rules by creating and linking to
 
-   :ref:`IMPORTED library targets <Imported Targets>`.
 
-   These keywords are interpreted immediately by this command and therefore
 
-   have no special meaning when produced by a generator expression.
 
- Items containing ``::``, such as ``Foo::Bar``, are assumed to be
 
- :ref:`IMPORTED <Imported Targets>` or :ref:`ALIAS <Alias Targets>` library
 
- target names and will cause an error if no such target exists.
 
- See policy :policy:`CMP0028`.
 
- See the :manual:`cmake-buildsystem(7)` manual for more on defining
 
- buildsystem properties.
 
- Libraries for a Target and/or its Dependents
 
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. code-block:: cmake
 
-   target_link_libraries(<target>
 
-                         <PRIVATE|PUBLIC|INTERFACE> <item>...
 
-                        [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
 
- The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE``
 
- :ref:`scope <Target Command Scope>` 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>``.
 
- Libraries for both a Target and its Dependents
 
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. code-block:: cmake
 
-   target_link_libraries(<target> <item>...)
 
- 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
 
- :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.
 
- Libraries for a Target and/or its Dependents (Legacy)
 
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. code-block:: cmake
 
-   target_link_libraries(<target>
 
-                         <LINK_PRIVATE|LINK_PUBLIC> <lib>...
 
-                        [<LINK_PRIVATE|LINK_PUBLIC> <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 :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`).
 
- Libraries for Dependents Only (Legacy)
 
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. code-block:: cmake
 
-   target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <item>...)
 
- 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``.
 
- Linking Object Libraries
 
- ^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. versionadded:: 3.12
 
- :ref:`Object Libraries` may be used as the ``<target>`` (first) argument
 
- of ``target_link_libraries`` to specify dependencies of their sources
 
- on other libraries.  For example, the code
 
- .. code-block:: cmake
 
-   add_library(A SHARED a.c)
 
-   target_compile_definitions(A PUBLIC A)
 
-   add_library(obj OBJECT obj.c)
 
-   target_compile_definitions(obj PUBLIC OBJ)
 
-   target_link_libraries(obj PUBLIC A)
 
- compiles ``obj.c`` with ``-DA -DOBJ`` and establishes usage requirements
 
- for ``obj`` that propagate to its dependents.
 
- Normal libraries and executables may link to :ref:`Object Libraries`
 
- to get their objects and usage requirements.  Continuing the above
 
- example, the code
 
- .. code-block:: cmake
 
-   add_library(B SHARED b.c)
 
-   target_link_libraries(B PUBLIC obj)
 
- compiles ``b.c`` with ``-DA -DOBJ``, creates shared library ``B``
 
- with object files from ``b.c`` and ``obj.c``, and links ``B`` to ``A``.
 
- Furthermore, the code
 
- .. code-block:: cmake
 
-   add_executable(main main.c)
 
-   target_link_libraries(main B)
 
- compiles ``main.c`` with ``-DA -DOBJ`` and links executable ``main``
 
- to ``B`` and ``A``.  The object library's usage requirements are
 
- propagated transitively through ``B``, but its object files are not.
 
- :ref:`Object Libraries` may "link" to other object libraries to get
 
- usage requirements, but since they do not have a link step nothing
 
- is done with their object files.  Continuing from the above example,
 
- the code:
 
- .. code-block:: cmake
 
-   add_library(obj2 OBJECT obj2.c)
 
-   target_link_libraries(obj2 PUBLIC obj)
 
-   add_executable(main2 main2.c)
 
-   target_link_libraries(main2 obj2)
 
- compiles ``obj2.c`` with ``-DA -DOBJ``, creates executable ``main2``
 
- with object files from ``main2.c`` and ``obj2.c``, and links ``main2``
 
- to ``A``.
 
- In other words, when :ref:`Object Libraries` appear in a target's
 
- :prop_tgt:`INTERFACE_LINK_LIBRARIES` property they will be
 
- treated as :ref:`Interface Libraries`, but when they appear in
 
- a target's :prop_tgt:`LINK_LIBRARIES` property their object files
 
- will be included in the link too.
 
- .. _`Linking Object Libraries via $<TARGET_OBJECTS>`:
 
- Linking Object Libraries via ``$<TARGET_OBJECTS>``
 
- """"""""""""""""""""""""""""""""""""""""""""""""""
 
- .. versionadded:: 3.21
 
- The object files associated with an object library may be referenced
 
- by the :genex:`$<TARGET_OBJECTS>` generator expression.  Such object
 
- files are placed on the link line *before* all libraries, regardless
 
- of their relative order.  Additionally, an ordering dependency will be
 
- added to the build system to make sure the object library is up-to-date
 
- before the dependent target links.  For example, the code
 
- .. code-block:: cmake
 
-   add_library(obj3 OBJECT obj3.c)
 
-   target_compile_definitions(obj3 PUBLIC OBJ3)
 
-   add_executable(main3 main3.c)
 
-   target_link_libraries(main3 PRIVATE a3 $<TARGET_OBJECTS:obj3> b3)
 
- links executable ``main3`` with object files from ``main3.c``
 
- and ``obj3.c`` followed by the ``a3`` and ``b3`` libraries.
 
- ``main3.c`` is *not* compiled with usage requirements from ``obj3``,
 
- such as ``-DOBJ3``.
 
- This approach can be used to achieve transitive inclusion of object
 
- files in link lines as usage requirements.  Continuing the above
 
- example, the code
 
- .. code-block:: cmake
 
-   add_library(iface_obj3 INTERFACE)
 
-   target_link_libraries(iface_obj3 INTERFACE obj3 $<TARGET_OBJECTS:obj3>)
 
- creates an interface library ``iface_obj3`` that forwards the ``obj3``
 
- usage requirements and adds the ``obj3`` object files to dependents'
 
- link lines.  The code
 
- .. code-block:: cmake
 
-   add_executable(use_obj3 use_obj3.c)
 
-   target_link_libraries(use_obj3 PRIVATE iface_obj3)
 
- compiles ``use_obj3.c`` with ``-DOBJ3`` and links executable ``use_obj3``
 
- with object files from ``use_obj3.c`` and ``obj3.c``.
 
- This also works transitively through a static library.  Since a static
 
- library does not link, it does not consume the object files from
 
- object libraries referenced this way.  Instead, the object files
 
- become transitive link dependencies of the static library.
 
- Continuing the above example, the code
 
- .. code-block:: cmake
 
-   add_library(static3 STATIC static3.c)
 
-   target_link_libraries(static3 PRIVATE iface_obj3)
 
-   add_executable(use_static3 use_static3.c)
 
-   target_link_libraries(use_static3 PRIVATE static3)
 
- compiles ``static3.c`` with ``-DOBJ3`` and creates ``libstatic3.a``
 
- using only its own object file.  ``use_static3.c`` is compiled *without*
 
- ``-DOBJ3`` because the usage requirement is not transitive through
 
- the private dependency of ``static3``.  However, the link dependencies
 
- of ``static3`` are propagated, including the ``iface_obj3`` reference
 
- to ``$<TARGET_OBJECTS:obj3>``.  The ``use_static3`` executable is
 
- created with object files from ``use_static3.c`` and ``obj3.c``, and
 
- linked to library ``libstatic3.a``.
 
- When using this approach, it is the project's responsibility to avoid
 
- linking multiple dependent binaries to ``iface_obj3``, because they will
 
- all get the ``obj3`` object files on their link lines.
 
- .. note::
 
-   Referencing :genex:`$<TARGET_OBJECTS>` in ``target_link_libraries``
 
-   calls worked in versions of CMake prior to 3.21 for some cases,
 
-   but was not fully supported:
 
-   * It did not place the object files before libraries on link lines.
 
-   * It did not add an ordering dependency on the object library.
 
-   * It did not work in Xcode with multiple architectures.
 
- Cyclic Dependencies of Static 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)
 
-   target_link_libraries(A B)
 
-   target_link_libraries(B A)
 
-   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 using the
 
- :prop_tgt:`LINK_INTERFACE_MULTIPLICITY` target property or 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, perhaps by using :ref:`Object Libraries`.
 
- Creating Relocatable Packages
 
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
- .. |INTERFACE_PROPERTY_LINK| replace:: :prop_tgt:`INTERFACE_LINK_LIBRARIES`
 
- .. include:: /include/INTERFACE_LINK_LIBRARIES_WARNING.txt
 
- See Also
 
- ^^^^^^^^
 
- * :command:`target_compile_definitions`
 
- * :command:`target_compile_features`
 
- * :command:`target_compile_options`
 
- * :command:`target_include_directories`
 
- * :command:`target_link_directories`
 
- * :command:`target_link_options`
 
- * :command:`target_precompile_headers`
 
- * :command:`target_sources`
 
 
  |