13,200
回編集
編集の要約なし |
|||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
CMakeには、プロジェクトのターゲット間の依存関係を管理して、正しくリンクするためのいくつかのリンカ関連コマンドがある。<br> | |||
<br> | |||
主要なコマンドには、ターゲットにリンクするライブラリを指定する<code>target_link_libraries</code>コマンド、ライブラリターゲットを追加する<code>add_library</code>コマンド、<br> | |||
ライブラリディレクトリを追加する<code>link_directories</code>がある。<br> | |||
<br> | |||
これらのコマンドを使用することにより、ライブラリや実行ファイルが必要な依存関係とともに正しくビルドされるようになる。<br> | |||
<br><br> | <br><br> | ||
== ターゲットのリンク == | == target_link_librariesコマンド == | ||
==== ==== | |||
<code>target_link_libraries</code>コマンドは、CMakeでターゲットがリンクするライブラリを指定するために使用する。<br> | |||
このコマンドにより、ターゲットが他のライブラリとどのように関係するかを定義することができる。<br> | |||
<br> | |||
<code>target_link_libraries</code>コマンドは、ターゲットがどのライブラリとリンクするかを定義して、ターゲット間の依存関係とビルド設定を管理するための重要なコマンドである。<br> | |||
修飾子を使用することで、ライブラリの可視性と依存関係の伝播を制御できる。<br> | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
# 基本構文 | |||
target_link_libraries(<ターゲット名> <修飾子 (PRIVATE|PUBLIC|INTERFACE)> | |||
<ライブラリ名 1> | |||
<ライブラリ名 2> | |||
... | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
* ターゲット名 | |||
*: プロジェクトのターゲット名 | |||
* 修飾子 (PRIVATE|PUBLIC|INTERFACE) | |||
*: ライブラリのリンクの可視性を制御する修飾子。 | |||
* ライブラリ名 | |||
*: リンクするライブラリ名 | |||
<br> | |||
==== ターゲットのリンク ==== | |||
<code>target_link_libraries</code>コマンドを呼び出す時は、常に、<code>PRIVATE</code>、<code>PUBLIC</code>、<code>INTERFACE</code>オプションを指定する。<br> | |||
<br> | |||
例えば、ライブラリAがライブラリBを必要とする時、ライブラリ間に存在し得る依存関係には、いくつかの異なる種類がある。<br> | 例えば、ライブラリAがライブラリBを必要とする時、ライブラリ間に存在し得る依存関係には、いくつかの異なる種類がある。<br> | ||
<br> | <br> | ||
| 9行目: | 40行目: | ||
*: プライベートな依存関係とは、ライブラリAが自身の内部実装でライブラリBを使用することを指定する。 | *: プライベートな依存関係とは、ライブラリAが自身の内部実装でライブラリBを使用することを指定する。 | ||
*: ライブラリAにリンクする他のものは、ライブラリBについて知る必要はない。なぜなら、ライブラリBはライブラリAの内部実装だからである。 | *: ライブラリAにリンクする他のものは、ライブラリBについて知る必要はない。なぜなら、ライブラリBはライブラリAの内部実装だからである。 | ||
*: <br> | |||
*: <u>指定したライブラリは、ターゲット自身のみに適用され、他のターゲットには適用されない。</u> | |||
* PUBLIC | * PUBLIC | ||
*: パブリックな依存関係とは、ライブラリAが内部でライブラリBを使用するだけでなく、そのインターフェイスでもライブラリBを使用することを指定する。 | *: パブリックな依存関係とは、ライブラリAが内部でライブラリBを使用するだけでなく、そのインターフェイスでもライブラリBを使用することを指定する。 | ||
*: 例えば、ライブラリAで定義された関数が、ライブラリBで定義・実装された型のパラメータを少なくとも1つ持つ場合、 | *: 例えば、ライブラリAで定義された関数が、ライブラリBで定義・実装された型のパラメータを少なくとも1つ持つ場合、 | ||
*: ライブラリBの型を持つパラメータを提供しなければ、ライブラリAからその関数を呼び出すことができない。 | *: ライブラリBの型を持つパラメータを提供しなければ、ライブラリAからその関数を呼び出すことができない。 | ||
*: <br> | |||
*: <u>指定したライブラリは、ターゲット自身と、そのターゲットをリンクする他のターゲットの両方に適用される。</u> | |||
* INTERFACE | * INTERFACE | ||
*: インターフェースな依存関係とは、ライブラリAを使用するために、ライブラリBの一部も使用しなければならないことを指定する。 | *: インターフェースな依存関係とは、ライブラリAを使用するために、ライブラリBの一部も使用しなければならないことを指定する。 | ||
*: これは、ライブラリAが内部的にライブラリBを必要とせず、そのインターフェイスでライブラリBを使用するだけであるという点で、<code>PUBLIC</code>とは異なる。 | *: これは、ライブラリAが内部的にライブラリBを必要とせず、そのインターフェイスでライブラリBを使用するだけであるという点で、<code>PUBLIC</code>とは異なる。 | ||
*: <br> | |||
*: <u>指定したライブラリは、ターゲットをリンクする他のターゲットにのみ適用され、ターゲット自身には適用されない。</u> | |||
*: <br> | *: <br> | ||
*: <code>add_library</code>コマンドのINTERFACE形式を使用して定義されたライブラリターゲットを使用する場合に便利である。 | *: <code>add_library</code>コマンドのINTERFACE形式を使用して定義されたライブラリターゲットを使用する場合に便利である。 | ||
| 59行目: | 96行目: | ||
このような場合、<code>target_link_libraries</code>コマンドで使用するターゲット名は、<br> | このような場合、<code>target_link_libraries</code>コマンドで使用するターゲット名は、<br> | ||
<code>target_link_libraries</code>コマンドが呼び出されている同じディレクトリにおいて、<code>add_executable</code>コマンドまたは<code>add_library</code>コマンドにより定義されている必要がある。<br> | <code>target_link_libraries</code>コマンドが呼び出されている同じディレクトリにおいて、<code>add_executable</code>コマンドまたは<code>add_library</code>コマンドにより定義されている必要がある。<br> | ||
<br> | <br> | ||
==== 非ターゲットのリンク ==== | |||
<code>target_link_libraries</code>コマンドは、CMakeのターゲット以外にも、以下に示すものを指定することが可能である。<br> | <code>target_link_libraries</code>コマンドは、CMakeのターゲット以外にも、以下に示すものを指定することが可能である。<br> | ||
<br> | <br> | ||
| 91行目: | 125行目: | ||
<br><br> | <br><br> | ||
== ライブラリパスの指定 == | == ライブラリパスの指定 (link_directoriesコマンド) == | ||
ライブラリパスを指定する場合、<code>link_directories</code>コマンドを使用する。<br> | ライブラリパスを指定する場合、<code>link_directories</code>コマンドを使用する。<br> | ||
<syntaxhighlight lang="cmake"> | <syntaxhighlight lang="cmake"> | ||