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

ナビゲーションに移動 検索に移動
91行目: 91行目:
  <syntaxhighlight lang="cmake">
  <syntaxhighlight lang="cmake">
  add_executable(
  add_executable(
     <実行ファイル名>
     <ターゲット名>
     <ソースコードファイル名 1>
     <ソースコードファイル名 1>
     <ソースコードファイル名 2>
     <ソースコードファイル名 2>
104行目: 104行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
<code><実行ファイル名></code>には、英数字、アンダースコア、ハイフンを使用することができる。<br>
<code><ターゲット名></code>には、英数字、アンダースコア、ハイフンを使用することができる。<br>
CMakeプロジェクトのビルドが正常に終了すると、<code><実行ファイル名></code>として実行ファイルが作成される。<br>
CMakeプロジェクトのビルドが正常に終了すると、<code><ターゲット名></code>として実行ファイルが作成される。<br>
<br>
<br>
実行ファイル名は、CMakeの機能であるターゲットプロパティでカスタマイズすることもできる。<Br>
ターゲット名は、CMakeの機能であるターゲットプロパティでカスタマイズすることもできる。<Br>
また、ターゲット名を変更して、<code>add_executable</code>コマンドを複数回呼び出すことにより、1つのCMakeLists.txtファイル内で複数の実行ファイルを定義することができる。<br>
また、ターゲット名を変更して、<code>add_executable</code>コマンドを複数回呼び出すことにより、1つのCMakeLists.txtファイル内で複数の実行ファイルを定義することができる。<br>
<br>
<br>
132行目: 132行目:
  )
  )
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== ライブラリの構築 (add_libraryコマンド) ==
CMakeは様々な種類のライブラリのビルドをサポートしている。<br>
ライブラリを作成して使用する場合、<code>add_library</code>コマンドを使用する。<br>
<syntaxhighlight lang="cmake">
add_library(
    <ターゲット名>
    [<STATIC または SHARED または MODULE>]
    [EXCLUDE_FROM_ALL]
    <ソースコードファイル名 1>
    <ソースコードファイル名 2>
    # ...略
)
</syntaxhighlight>
<br>
<code><ターゲット名></code>は、CMakeLists.txtファイル内でライブラリを参照するために使用される。<br>
ビルドされたライブラリ名は、<code><ターゲット名></code>となる。<br>
<br>
<code>EXCLUDE_FROM_ALL</code>オプションは、<code>add_executable</code>コマンドと同様、ライブラリがデフォルトのALLターゲットに含まれないようにする。<br>
構築するライブラリの種類は、<code>STATIC</code>、<code>SHARED</code>、<code>MODULE</code>のうちの1つを指定する。<br>
<br>
* STATICオプション
*: 静的ライブラリまたはアーカイブを指定する。
*: Windowsでは、デフォルトのライブラリ名は、<u><ライブラリファイル名>.lib</u>となる。
*: Linuxでは、デフォルトのライブラリ名は、<u>lib<ライブラリファイル名>.a</u>となる。
* SHARED
*: 共有ライブラリまたは動的ライブラリを指定する。
*: Windowsでは、デフォルトのライブラリ名は、<u><ライブラリファイル名>.dll</u>となる。
*: Linuxでは、デフォルトのライブラリ名は、<u>lib<ライブラリファイル名>.so</u>となる。
* MODULE
*: 共有ライブラリに似ているが、ライブラリや実行ファイルに直接リンクされるのではなく、実行時に動的にロードされることを意図しているライブラリを指定する。
*: これらは、ユーザがロードするかどうかを選択できるプラグイン、または、オプションのコンポーネントである。
*: Windowsでは、DLL向けのインポートライブラリは作成されない。
<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>


案内メニュー