• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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