「Qtの設定 - CMake」の版間の差分

ナビゲーションに移動 検索に移動
326行目: 326行目:
変数<code>BUILD_SHARED_LIBS</code>を設定する方法として、<code>cmake</code>コマンドに<code>-DBUILD_SHARED_LIBS</code>オプションを付加する方法がある。<br>
変数<code>BUILD_SHARED_LIBS</code>を設定する方法として、<code>cmake</code>コマンドに<code>-DBUILD_SHARED_LIBS</code>オプションを付加する方法がある。<br>
  cmake -DBUILD_SHARED_LIBS=YES /path/to/source
  cmake -DBUILD_SHARED_LIBS=YES /path/to/source
<br><br>
== ターゲットのリンク ==
例えば、ライブラリAがライブラリBを必要とする時、ライブラリ間に存在し得る依存関係には、いくつかの異なる種類がある。<br>
<br>
* PRIVATE
*: プライベートな依存関係とは、ライブラリAが自身の内部実装でライブラリBを使用することを指定する。
*: ライブラリAにリンクする他のものは、ライブラリBについて知る必要はない。なぜなら、ライブラリBはライブラリAの内部実装だからである。
* PUBLIC
*: パブリックな依存関係とは、ライブラリAが内部でライブラリBを使用するだけでなく、そのインターフェイスでもライブラリBを使用することを指定する。
*: 例えば、ライブラリAで定義された関数が、ライブラリBで定義・実装された型のパラメータを少なくとも1つ持つ場合、
*: ライブラリBの型を持つパラメータを提供しなければ、ライブラリAからその関数を呼び出すことができない。
* INTERFACE
*: インターフェースな依存関係とは、ライブラリAを使用するために、ライブラリBの一部も使用しなければならないことを指定する。
*: これは、ライブラリAが内部的にライブラリBを必要とせず、そのインターフェイスでライブラリBを使用するだけであるという点で、<code>PUBLIC</code>とは異なる。
*: <br>
*: <code>add_library</code>コマンドのINTERFACE形式を使用して定義されたライブラリターゲットを使用する場合に便利である。
*: 例えば、ヘッダファイルのみのライブラリの依存関係を表すためにターゲットを使用する場合等が挙げられる。
<br>
<code>target_link_libraries</code>コマンドを使用して、リンクだけではなく、依存関係を捉えることができる。<br>
<syntaxhighlight lang="cmake">
target_link_libraries(
    <ターゲット名>
    <PRIVATE または PUBLIC または INTERFACE>
    item 1
    item 2
    # ...略
    [<PRIVATE または PUBLIC または INTERFACE>]
    item 3
    item 4
    # ...略
)
</syntaxhighlight>
<br>
これにより、あるライブラリが他のライブラリにどのように依存するかをプロジェクトで定義することができる。<br>
CMakeは、この方法でリンクされたライブラリの連鎖を通して依存関係を管理する。<br>
<br>
以下の例では、uiライブラリは<code>PUBLIC</code>としてcollectorライブラリとリンクされているため、myAppが直接collectorにリンクしているだけでも、その<code>PUBLIC</code>関係からmyAppはuiにもリンクされる。<br>
一方、algoライブラリとengineライブラリは、<code>PRIVATE</code>としてcollectorにリンクされているため、myAppはそれらに直接リンクされるわけではない。<br>
これらのコマンドにより、ターゲット間で<code>target_link_libraries</code>コマンドで接続された場合、コンパイラやリンカのフラグやヘッダ検索パスもターゲット間で伝達されるようになる。<br>
<syntaxhighlight lang="cmake">
add_library(collector src1.cpp)
add_library(algo src2.cpp)
add_library(engine src3.cpp)
add_library(ui src4.cpp)
add_executable(myApp main.cpp)
target_link_libraries(
  collector
   PUBLIC ui
   PRIVATE algo engine
)
target_link_libraries(myApp PRIVATE collector)
</syntaxhighlight>
<br>
このような場合、<code>target_link_libraries</code>コマンドで使用するターゲット名は、<br>
<code>target_link_libraries</code>コマンドが呼び出されている同じディレクトリにおいて、<code>add_executable</code>コマンドまたは<code>add_library</code>コマンドにより定義されている必要がある。<br>
<br><br>
<br><br>


案内メニュー