📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == <br><br> == ターゲットのリンク == 例えば、ライブラリAがライブラリBを必要とする時、ライブラリ間に存在し得る依存関係には、いくつかの異なる種類がある。<br> <br> * PRIVATE *: プライベートな依存関係とは、ライブラリAが自身の内部実装でライブラリBを使用することを指定する。 *: ライブラリAにリンクする他のものは、ライブラリBにつ…」 |
細 文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag… |
||
| (同じ利用者による、間の6版が非表示) | |||
| 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行目: | 39行目: | ||
*: プライベートな依存関係とは、ライブラリ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行目: | 95行目: | ||
このような場合、<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> | ||
| 90行目: | 123行目: | ||
*: 項目の前にgeneralオプションを付加する場合、全てのビルド構成に対して項目を追加するように指定する。 | *: 項目の前にgeneralオプションを付加する場合、全てのビルド構成に対して項目を追加するように指定する。 | ||
<br><br> | <br><br> | ||
== ライブラリの検索 == | |||
find_libraryコマンドを使用して、特定の名前のライブラリを検索することができる。<br> | |||
* NAMESオプション | |||
*: ライブラリ名を指定することにより、libプレフィックス無しでライブラリを検索する。 | |||
* PATHSオプション | |||
*: 任意 | |||
*: ライブラリを検索する場所を指定する。 | |||
*: 必要に応じて、パスを調整する。 | |||
* NO_DEFAULT_PATHオプション | |||
*: 任意 | |||
*: 指定したパスのみを検索する。 | |||
<br> | |||
以下の例では、動的ライブラリであるlibsmbclient.soファイルを検索して使用している。<br> | |||
もし、ライブラリの検索に失敗した場合、エラーメッセージを表示してビルドを停止する。<br> | |||
ターゲット (実行可能ファイルまたはライブラリ) を定義する。<br> | |||
target_link_librariesコマンドを使用して、検索で発見したライブラリをターゲットにリンクする。<br> | |||
<syntaxhighlight lang="cmake"> | |||
# ライブラリの検索 | |||
find_library(SMBCLIENT_LIBRARY | |||
NAMES sambclient | |||
PATHS /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib # PATHオプションは任意 | |||
NO_DEFAULT_PATH # NO_DEFAULT_PATHオプションは任意 | |||
) | |||
# ライブラリの検索に成功したかどうかを確認 | |||
if(NOT SMBCLIENT_LIBRARY) | |||
message(FATAL_ERROR "libsmbclient.so library not found") | |||
endif() | |||
# ターゲット (実行可能ファイルまたはライブラリ) を定義 | |||
# Qtの場合は、qt_add_executableコマンドを使用する | |||
add_executable(<ターゲット名> | |||
<ソースファイル 1> | |||
<ソースファイル 2> | |||
# ...略 | |||
) | |||
# ターゲットにライブラリをリンク | |||
target_link_libraries(<ターゲット名> | |||
${SMBCLIENT_LIBRARY} | |||
# ...略 | |||
) | |||
</syntaxhighlight> | |||
<br><br> | |||
== ライブラリパスの指定 (target_link_directoriesコマンド) == | |||
<code>target_link_directories</code>コマンドは、特定のターゲット (実行可能ファイルやライブラリ) に対して、リンカが追加のライブラリを検索する場所を指定する。<br> | |||
<br> | |||
target_link_directoriesコマンドの特徴を以下に示す。<br> | |||
* スコープの明確化 | |||
*: <code>target_link_directories</code>コマンドは、特定のターゲットに対してのみリンクディレクトリを設定するため、影響範囲が明確である。 | |||
* より細かい制御 | |||
*: ターゲット単位で設定できるため、プロジェクト全体ではなく必要なターゲットにのみ適用できる。 | |||
* ジェネレータ式の対応 | |||
*: <code>target_link_directories</code>コマンドはジェネレータ式をサポートしており、より柔軟な設定が可能である。 | |||
*: ${CMAKE_CURRENT_SOURCE_DIR}のようなCMake変数や、$<...>のようなジェネレータ式が使用できる。 | |||
* 順序 | |||
*: 複数のディレクトリを指定する場合、最初に指定したディレクトリから検索する。 | |||
<br> | |||
基本的な構文を以下に示す。<br> | |||
<syntaxhighlight lang="cmake"> | |||
target_link_directories(<ターゲット名> | |||
<INTERFACE|PUBLIC|PRIVATE> [items1...] # INTERFACE, PUBLIC, PRIVATE: リンクディレクトリの適用スコープ | |||
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...] # INTERFACE, PUBLIC, PRIVATE: リンクディレクトリの適用スコープ | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
スコープの意味を以下に示す。<br> | |||
* PRIVATE | |||
*: 指定したディレクトリは、このターゲットのみに適用される。 | |||
*: このターゲットに依存する他のターゲットには伝播しない。 | |||
*: <br> | |||
* INTERFACE | |||
*: このターゲットには適用されず、このターゲットに依存する他のターゲットに伝播する。 | |||
*: 主にインターフェースライブラリで使用する。 | |||
*: <br> | |||
* PUBLIC | |||
*: PRIVATEとINTERFACEの組み合わせである。 | |||
*: このターゲットとそれに依存する他のターゲットの両方に適用される。 | |||
<br> | |||
以下の例では、ターゲット1 (mylib) は、/path/to/private/libsおよび/path/to/public/libsからライブラリを検索する。<br> | |||
ターゲット2 (myapp) は、/path/to/public/libsおよび/path/to/interface/libsからライブラリを検索する。 (mylibに依存しているため)<br> | |||
<syntaxhighlight lang="cmake"> | |||
add_library(mylib STATIC | |||
source1.cpp | |||
source2.cpp | |||
) | |||
target_link_directories(mylib | |||
PRIVATE /path/to/private/libs | |||
PUBLIC /path/to/public/libs | |||
INTERFACE /path/to/interface/libs | |||
) | |||
add_executable(myapp | |||
main.cpp | |||
) | |||
target_link_libraries(myapp PRIVATE | |||
mylib | |||
) | |||
</syntaxhighlight> | |||
<br><br> | |||
== ライブラリパスの指定 (link_directoriesコマンド) == | |||
<u><code>link_directories</code>コマンドの使用は非推奨である。</u><br> | |||
<u>代わりに、<code>target_link_directories</code>コマンドを使用することが推奨されている。</u><br> | |||
<br> | |||
ライブラリパスを指定する場合、<code>link_directories</code>コマンドを使用する。<br> | |||
<syntaxhighlight lang="cmake"> | |||
link_directories(/path/to/lib) | |||
</syntaxhighlight> | |||
<br> | |||
<code>link_directories</code>コマンドを複数使用する場合、デフォルトでは、指定したパスは最後尾となる。<br> | |||
ただし、<code>link_directories</code>コマンドに<code>BEFORE</code>オプションを付加した場合は最前となる。<br> | |||
<br> | |||
以下の例では、"-I/path1/to/lib -I/path2/to/lib"となる。<br> | |||
<syntaxhighlight lang="cmake"> | |||
link_directories(/path1/to/lib) | |||
link_directories(/path2/to/lib) | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、"-I/path2/to/lib -I/path1/to/lib" となる。<br> | |||
<syntaxhighlight lang="cmake"> | |||
link_directories(/path1/to/lib) | |||
link_directories(BEFORE /path2/to/lib) | |||
</syntaxhighlight> | |||
<br><br> | |||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:Qt]] | [[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:Qt]] | ||