# LINK_OPTIONS

Added in version 3.13.

List of options to use for the link step of shared library, module and executable targets as well as the device link step. Targets that are static libraries need to use the `STATIC_LIBRARY_OPTIONS` target property.

These options are used for both normal linking and device linking (see policy `CMP0105`). To control link options for normal and device link steps, `$<HOST_LINK>` and `$<DEVICE_LINK>` generator expressions can be used.

This property holds a semicolon-separated list of options specified so far for its target. Use the `target_link_options()` command to append more options.

This property is initialized by the `LINK_OPTIONS` directory property when a target is created, and is used by the generators to set the options for the compiler.

Contents of `LINK_OPTIONS` may use "generator expressions" with the syntax `$<...>`. See the `cmake-generator-expressions(7)` manual for available expressions. See the `cmake-buildsystem(7)` manual for more on defining buildsystem properties.

Note

This property must be used in preference to `LINK_FLAGS` property.

## Host And Device Specific Link Options

Added in version 3.18: When a device link step is involved, which is controlled by `CUDA_SEPARABLE_COMPILATION` and `CUDA_RESOLVE_DEVICE_SYMBOLS` properties and policy `CMP0105`, the raw options will be delivered to the host and device link steps (wrapped in `-Xcompiler` or equivalent for device link). Options wrapped with `$<DEVICE_LINK:...>` generator expression will be used only for the device link step. Options wrapped with `$<HOST_LINK:...>` generator expression will be used only for the host link step.

## Option De-duplication

The final set of options used for a target is constructed by accumulating options from the current target and the usage requirements of its dependencies. The set of options is de-duplicated to avoid repetition.

Added in version 3.12: While beneficial for individual options, the de-duplication step can break up option groups. For example, `-option A -option B` becomes `-option A B`. One may specify a group of options using shell-like quoting along with a `SHELL:` prefix. The `SHELL:` prefix is dropped, and the rest of the option string is parsed using the `separate_arguments()` `UNIX_COMMAND` mode. For example, `"SHELL:-option A" "SHELL:-option B"` becomes `-option A -option B`.

## Handling Compiler Driver Differences

To pass options to the linker tool, each compiler driver has its own syntax. The `LINKER:` prefix and `,` separator can be used to specify, in a portable way, options to pass to the linker tool. `LINKER:` is replaced by the appropriate driver option and `,` by the appropriate driver separator. The driver prefix and driver separator are given by the values of the `CMAKE_<LANG>_LINKER_WRAPPER_FLAG` and `CMAKE_<LANG>_LINKER_WRAPPER_FLAG_SEP` variables.

For example, `"LINKER:-z,defs"` becomes `-Xlinker -z -Xlinker defs` for `Clang` and `-Wl,-z,defs` for `GNU GCC`.

The `LINKER:` prefix can be specified as part of a `SHELL:` prefix expression.

The `LINKER:` prefix supports, as an alternative syntax, specification of arguments using the `SHELL:` prefix and space as separator. The previous example then becomes `"LINKER:SHELL:-z defs"`.

Note

Specifying the `SHELL:` prefix anywhere other than at the beginning of the `LINKER:` prefix is not supported.