1target_link_libraries 2--------------------- 3 4.. only:: html 5 6 .. contents:: 7 8Specify libraries or flags to use when linking a given target and/or 9its dependents. :ref:`Usage requirements <Target Usage Requirements>` 10from linked library targets will be propagated. Usage requirements 11of a target's dependencies affect compilation of its own sources. 12 13Overview 14^^^^^^^^ 15 16This command has several signatures as detailed in subsections below. 17All of them have the general form 18 19.. code-block:: cmake 20 21 target_link_libraries(<target> ... <item>... ...) 22 23The named ``<target>`` must have been created by a command such as 24:command:`add_executable` or :command:`add_library` and must not be an 25:ref:`ALIAS target <Alias Targets>`. If policy :policy:`CMP0079` is not 26set to ``NEW`` then the target must have been created in the current 27directory. Repeated calls for the same ``<target>`` append items in 28the order called. 29 30.. versionadded:: 3.13 31 The ``<target>`` doesn't have to be defined in the same directory as the 32 ``target_link_libraries`` call. 33 34Each ``<item>`` may be: 35 36* **A library target name**: The generated link line will have the 37 full path to the linkable library file associated with the target. 38 The buildsystem will have a dependency to re-link ``<target>`` if 39 the library file changes. 40 41 The named target must be created by :command:`add_library` within 42 the project or as an :ref:`IMPORTED library <Imported Targets>`. 43 If it is created within the project an ordering dependency will 44 automatically be added in the build system to make sure the named 45 library target is up-to-date before the ``<target>`` links. 46 47 If an imported library has the :prop_tgt:`IMPORTED_NO_SONAME` 48 target property set, CMake may ask the linker to search for 49 the library instead of using the full path 50 (e.g. ``/usr/lib/libfoo.so`` becomes ``-lfoo``). 51 52 The full path to the target's artifact will be quoted/escaped for 53 the shell automatically. 54 55* **A full path to a library file**: The generated link line will 56 normally preserve the full path to the file. The buildsystem will 57 have a dependency to re-link ``<target>`` if the library file changes. 58 59 There are some cases where CMake may ask the linker to search for 60 the library (e.g. ``/usr/lib/libfoo.so`` becomes ``-lfoo``), such 61 as when a shared library is detected to have no ``SONAME`` field. 62 See policy :policy:`CMP0060` for discussion of another case. 63 64 If the library file is in a macOS framework, the ``Headers`` directory 65 of the framework will also be processed as a 66 :ref:`usage requirement <Target Usage Requirements>`. This has the same 67 effect as passing the framework directory as an include directory. 68 69 .. versionadded:: 3.8 70 On :ref:`Visual Studio Generators` for VS 2010 and above, library files 71 ending in ``.targets`` will be treated as MSBuild targets files and 72 imported into generated project files. This is not supported by other 73 generators. 74 75 The full path to the library file will be quoted/escaped for 76 the shell automatically. 77 78* **A plain library name**: The generated link line will ask the linker 79 to search for the library (e.g. ``foo`` becomes ``-lfoo`` or ``foo.lib``). 80 81 The library name/flag is treated as a command-line string fragment and 82 will be used with no extra quoting or escaping. 83 84* **A link flag**: Item names starting with ``-``, but not ``-l`` or 85 ``-framework``, are treated as linker flags. Note that such flags will 86 be treated like any other library link item for purposes of transitive 87 dependencies, so they are generally safe to specify only as private link 88 items that will not propagate to dependents. 89 90 Link flags specified here are inserted into the link command in the same 91 place as the link libraries. This might not be correct, depending on 92 the linker. Use the :prop_tgt:`LINK_OPTIONS` target property or 93 :command:`target_link_options` command to add link 94 flags explicitly. The flags will then be placed at the toolchain-defined 95 flag position in the link command. 96 97 .. versionadded:: 3.13 98 :prop_tgt:`LINK_OPTIONS` target property and :command:`target_link_options` 99 command. For earlier versions of CMake, use :prop_tgt:`LINK_FLAGS` 100 property instead. 101 102 The link flag is treated as a command-line string fragment and 103 will be used with no extra quoting or escaping. 104 105* **A generator expression**: A ``$<...>`` :manual:`generator expression 106 <cmake-generator-expressions(7)>` may evaluate to any of the above 107 items or to a :ref:`semicolon-separated list <CMake Language Lists>` of them. 108 If the ``...`` contains any ``;`` characters, e.g. after evaluation 109 of a ``${list}`` variable, be sure to use an explicitly quoted 110 argument ``"$<...>"`` so that this command receives it as a 111 single ``<item>``. 112 113 Additionally, a generator expression may be used as a fragment of 114 any of the above items, e.g. ``foo$<1:_d>``. 115 116 Note that generator expressions will not be used in OLD handling of 117 policy :policy:`CMP0003` or policy :policy:`CMP0004`. 118 119* A ``debug``, ``optimized``, or ``general`` keyword immediately followed 120 by another ``<item>``. The item following such a keyword will be used 121 only for the corresponding build configuration. The ``debug`` keyword 122 corresponds to the ``Debug`` configuration (or to configurations named 123 in the :prop_gbl:`DEBUG_CONFIGURATIONS` global property if it is set). 124 The ``optimized`` keyword corresponds to all other configurations. The 125 ``general`` keyword corresponds to all configurations, and is purely 126 optional. Higher granularity may be achieved for per-configuration 127 rules by creating and linking to 128 :ref:`IMPORTED library targets <Imported Targets>`. 129 These keywords are interpreted immediately by this command and therefore 130 have no special meaning when produced by a generator expression. 131 132Items containing ``::``, such as ``Foo::Bar``, are assumed to be 133:ref:`IMPORTED <Imported Targets>` or :ref:`ALIAS <Alias Targets>` library 134target names and will cause an error if no such target exists. 135See policy :policy:`CMP0028`. 136 137See the :manual:`cmake-buildsystem(7)` manual for more on defining 138buildsystem properties. 139 140Libraries for a Target and/or its Dependents 141^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 142 143.. code-block:: cmake 144 145 target_link_libraries(<target> 146 <PRIVATE|PUBLIC|INTERFACE> <item>... 147 [<PRIVATE|PUBLIC|INTERFACE> <item>...]...) 148 149The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE`` keywords can be used to 150specify both the link dependencies and the link interface in one command. 151Libraries and targets following ``PUBLIC`` are linked to, and are made 152part of the link interface. Libraries and targets following ``PRIVATE`` 153are linked to, but are not made part of the link interface. Libraries 154following ``INTERFACE`` are appended to the link interface and are not 155used for linking ``<target>``. 156 157Libraries for both a Target and its Dependents 158^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 159 160.. code-block:: cmake 161 162 target_link_libraries(<target> <item>...) 163 164Library dependencies are transitive by default with this signature. 165When this target is linked into another target then the libraries 166linked to this target will appear on the link line for the other 167target too. This transitive "link interface" is stored in the 168:prop_tgt:`INTERFACE_LINK_LIBRARIES` target property and may be overridden 169by setting the property directly. When :policy:`CMP0022` is not set to 170``NEW``, transitive linking is built in but may be overridden by the 171:prop_tgt:`LINK_INTERFACE_LIBRARIES` property. Calls to other signatures 172of this command may set the property making any libraries linked 173exclusively by this signature private. 174 175Libraries for a Target and/or its Dependents (Legacy) 176^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 177 178.. code-block:: cmake 179 180 target_link_libraries(<target> 181 <LINK_PRIVATE|LINK_PUBLIC> <lib>... 182 [<LINK_PRIVATE|LINK_PUBLIC> <lib>...]...) 183 184The ``LINK_PUBLIC`` and ``LINK_PRIVATE`` modes can be used to specify both 185the link dependencies and the link interface in one command. 186 187This signature is for compatibility only. Prefer the ``PUBLIC`` or 188``PRIVATE`` keywords instead. 189 190Libraries and targets following ``LINK_PUBLIC`` are linked to, and are 191made part of the :prop_tgt:`INTERFACE_LINK_LIBRARIES`. If policy 192:policy:`CMP0022` is not ``NEW``, they are also made part of the 193:prop_tgt:`LINK_INTERFACE_LIBRARIES`. Libraries and targets following 194``LINK_PRIVATE`` are linked to, but are not made part of the 195:prop_tgt:`INTERFACE_LINK_LIBRARIES` (or :prop_tgt:`LINK_INTERFACE_LIBRARIES`). 196 197Libraries for Dependents Only (Legacy) 198^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 199 200.. code-block:: cmake 201 202 target_link_libraries(<target> LINK_INTERFACE_LIBRARIES <item>...) 203 204The ``LINK_INTERFACE_LIBRARIES`` mode appends the libraries to the 205:prop_tgt:`INTERFACE_LINK_LIBRARIES` target property instead of using them 206for linking. If policy :policy:`CMP0022` is not ``NEW``, then this mode 207also appends libraries to the :prop_tgt:`LINK_INTERFACE_LIBRARIES` and its 208per-configuration equivalent. 209 210This signature is for compatibility only. Prefer the ``INTERFACE`` mode 211instead. 212 213Libraries specified as ``debug`` are wrapped in a generator expression to 214correspond to debug builds. If policy :policy:`CMP0022` is 215not ``NEW``, the libraries are also appended to the 216:prop_tgt:`LINK_INTERFACE_LIBRARIES_DEBUG <LINK_INTERFACE_LIBRARIES_<CONFIG>>` 217property (or to the properties corresponding to configurations listed in 218the :prop_gbl:`DEBUG_CONFIGURATIONS` global property if it is set). 219Libraries specified as ``optimized`` are appended to the 220:prop_tgt:`INTERFACE_LINK_LIBRARIES` property. If policy :policy:`CMP0022` 221is not ``NEW``, they are also appended to the 222:prop_tgt:`LINK_INTERFACE_LIBRARIES` property. Libraries specified as 223``general`` (or without any keyword) are treated as if specified for both 224``debug`` and ``optimized``. 225 226Linking Object Libraries 227^^^^^^^^^^^^^^^^^^^^^^^^ 228 229.. versionadded:: 3.12 230 231:ref:`Object Libraries` may be used as the ``<target>`` (first) argument 232of ``target_link_libraries`` to specify dependencies of their sources 233on other libraries. For example, the code 234 235.. code-block:: cmake 236 237 add_library(A SHARED a.c) 238 target_compile_definitions(A PUBLIC A) 239 240 add_library(obj OBJECT obj.c) 241 target_compile_definitions(obj PUBLIC OBJ) 242 target_link_libraries(obj PUBLIC A) 243 244compiles ``obj.c`` with ``-DA -DOBJ`` and establishes usage requirements 245for ``obj`` that propagate to its dependents. 246 247Normal libraries and executables may link to :ref:`Object Libraries` 248to get their objects and usage requirements. Continuing the above 249example, the code 250 251.. code-block:: cmake 252 253 add_library(B SHARED b.c) 254 target_link_libraries(B PUBLIC obj) 255 256compiles ``b.c`` with ``-DA -DOBJ``, creates shared library ``B`` 257with object files from ``b.c`` and ``obj.c``, and links ``B`` to ``A``. 258Furthermore, the code 259 260.. code-block:: cmake 261 262 add_executable(main main.c) 263 target_link_libraries(main B) 264 265compiles ``main.c`` with ``-DA -DOBJ`` and links executable ``main`` 266to ``B`` and ``A``. The object library's usage requirements are 267propagated transitively through ``B``, but its object files are not. 268 269:ref:`Object Libraries` may "link" to other object libraries to get 270usage requirements, but since they do not have a link step nothing 271is done with their object files. Continuing from the above example, 272the code: 273 274.. code-block:: cmake 275 276 add_library(obj2 OBJECT obj2.c) 277 target_link_libraries(obj2 PUBLIC obj) 278 279 add_executable(main2 main2.c) 280 target_link_libraries(main2 obj2) 281 282compiles ``obj2.c`` with ``-DA -DOBJ``, creates executable ``main2`` 283with object files from ``main2.c`` and ``obj2.c``, and links ``main2`` 284to ``A``. 285 286In other words, when :ref:`Object Libraries` appear in a target's 287:prop_tgt:`INTERFACE_LINK_LIBRARIES` property they will be 288treated as :ref:`Interface Libraries`, but when they appear in 289a target's :prop_tgt:`LINK_LIBRARIES` property their object files 290will be included in the link too. 291 292.. _`Linking Object Libraries via $<TARGET_OBJECTS>`: 293 294Linking Object Libraries via $<TARGET_OBJECTS> 295"""""""""""""""""""""""""""""""""""""""""""""" 296 297.. versionadded:: 3.21 298 299The object files associated with an object library may be referenced 300by the :genex:`$<TARGET_OBJECTS>` generator expression. Such object 301files are placed on the link line *before* all libraries, regardless 302of their relative order. Additionally, an ordering dependency will be 303added to the build system to make sure the object library is up-to-date 304before the dependent target links. For example, the code 305 306.. code-block:: cmake 307 308 add_library(obj3 OBJECT obj3.c) 309 target_compile_definitions(obj3 PUBLIC OBJ3) 310 311 add_executable(main3 main3.c) 312 target_link_libraries(main3 PRIVATE a3 $<TARGET_OBJECTS:obj3> b3) 313 314links executable ``main3`` with object files from ``main3.c`` 315and ``obj3.c`` followed by the ``a3`` and ``b3`` libraries. 316``main3.c`` is *not* compiled with usage requirements from ``obj3``, 317such as ``-DOBJ3``. 318 319This approach can be used to achieve transitive inclusion of object 320files in link lines as usage requirements. Continuing the above 321example, the code 322 323.. code-block:: cmake 324 325 add_library(iface_obj3 INTERFACE) 326 target_link_libraries(iface_obj3 INTERFACE obj3 $<TARGET_OBJECTS:obj3>) 327 328creates an interface library ``iface_obj3`` that forwards the ``obj3`` 329usage requirements and adds the ``obj3`` object files to dependents' 330link lines. The code 331 332.. code-block:: cmake 333 334 add_executable(use_obj3 use_obj3.c) 335 target_link_libraries(use_obj3 PRIVATE iface_obj3) 336 337compiles ``use_obj3.c`` with ``-DOBJ3`` and links executable ``use_obj3`` 338with object files from ``use_obj3.c`` and ``obj3.c``. 339 340This also works transitively through a static library. Since a static 341library does not link, it does not consume the object files from 342object libraries referenced this way. Instead, the object files 343become transitive link dependencies of the static library. 344Continuing the above example, the code 345 346.. code-block:: cmake 347 348 add_library(static3 STATIC static3.c) 349 target_link_libraries(static3 PRIVATE iface_obj3) 350 351 add_executable(use_static3 use_static3.c) 352 target_link_libraries(use_static3 PRIVATE static3) 353 354compiles ``static3.c`` with ``-DOBJ3`` and creates ``libstatic3.a`` 355using only its own object file. ``use_static3.c`` is compiled *without* 356``-DOBJ3`` because the usage requirement is not transitive through 357the private dependency of ``static3``. However, the link dependencies 358of ``static3`` are propagated, including the ``iface_obj3`` reference 359to ``$<TARGET_OBJECTS:obj3>``. The ``use_static3`` executable is 360created with object files from ``use_static3.c`` and ``obj3.c``, and 361linked to library ``libstatic3.a``. 362 363When using this approach, it is the project's responsibility to avoid 364linking multiple dependent binaries to ``iface_obj3``, because they will 365all get the ``obj3`` object files on their link lines. 366 367.. note:: 368 369 Referencing :genex:`$<TARGET_OBJECTS>` in ``target_link_libraries`` 370 calls worked in versions of CMake prior to 3.21 for some cases, 371 but was not fully supported: 372 373 * It did not place the object files before libraries on link lines. 374 * It did not add an ordering dependency on the object library. 375 * It did not work in Xcode with multiple architectures. 376 377Cyclic Dependencies of Static Libraries 378^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 379 380The library dependency graph is normally acyclic (a DAG), but in the case 381of mutually-dependent ``STATIC`` libraries CMake allows the graph to 382contain cycles (strongly connected components). When another target links 383to one of the libraries, CMake repeats the entire connected component. 384For example, the code 385 386.. code-block:: cmake 387 388 add_library(A STATIC a.c) 389 add_library(B STATIC b.c) 390 target_link_libraries(A B) 391 target_link_libraries(B A) 392 add_executable(main main.c) 393 target_link_libraries(main A) 394 395links ``main`` to ``A B A B``. While one repetition is usually 396sufficient, pathological object file and symbol arrangements can require 397more. One may handle such cases by using the 398:prop_tgt:`LINK_INTERFACE_MULTIPLICITY` target property or by manually 399repeating the component in the last ``target_link_libraries`` call. 400However, if two archives are really so interdependent they should probably 401be combined into a single archive, perhaps by using :ref:`Object Libraries`. 402 403Creating Relocatable Packages 404^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 405 406.. |INTERFACE_PROPERTY_LINK| replace:: :prop_tgt:`INTERFACE_LINK_LIBRARIES` 407.. include:: /include/INTERFACE_LINK_LIBRARIES_WARNING.txt 408