web-dev-qa-db-ja.com

CMakeインストール(サブディレクトリにTARGETS)

以下を検討してくださいCMakeLists.txtファイル:

add_subdirectory(execA)
add_subdirectory(libB)

install(TARGETS execA libB
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

次のエラーが発生します。

install TARGETS given target "execA" which does not exist in this
  directory

execAlibBには独自のCMakeList.txtファイルはprojectディレクトリの下にあります。また、私が実行しているビルドディレクトリcmakecmake ..):

project
  |------ CMakeList.txt (the one with the code)
  |----execA
  |      \- .cpp, .hpp and CMakelist.txt
  |----libB
  |      \- .cpp, .hpp and CMakelist.txt
  |---- lib
  |---- bin
  \---- build (where I´m commanding: $ cmake ..

このエラーを修正するにはどうすればよいですか?

23
Mendes

このバグレポート によると、install(TARGETS)コマンドフローは、同じディレクトリ内に作成されたターゲットのみを受け入れます

そのため、add_library()呼び出しを最上位のディレクトリに移動するか、install(TARGETS)呼び出しをターゲットごとの呼び出しに分割し、それぞれを対応するサブディレクトリに移動する必要があります。

CMake 3.13以降install(TARGETS)can can 他のディレクトリに作成されたターゲットでも。

install(TARGETS)は、他のディレクトリに作成されたターゲットをインストールできます。このようなクロスディレクトリインストールルールを使用する場合は、make install(または類似の)サブディレクトリからの場合、他のディレクトリからのターゲットが最新であることは保証されません。

15
Tsyvarev

これはまだCMake 3.11の問題点のようです。

私たちのコードベースでは、多くのターゲットがサブディレクトリで定義されており、異なる構成とターゲットの(重複する可能性のある)組み合わせでインストーラーの品揃えを作成する必要があります。

これが私の解決策です:

  • ルートCMakeLists.txtファイルでadd_subdirectoryを呼び出す前に、インストーラーに含めるターゲットの名前を指定してGLOBALプロパティを作成します。
  • 独自のカスタム関数でターゲット作成関数(add_executableなど)をラップします。これらの関数内で、ターゲットがグローバルプロパティに存在するかどうかを確認し、それに応じてinstallを呼び出します。

このアプローチにより、インストーラー構成を集中化できます。

また、複数のインストーラーの作成をサポートするために、個別の.cmakeファイルに他のインストーラープロパティと共にグローバルリストを入力します。 cmakeを呼び出すときに、インストーラー構成のCMakeファイルの名前をコマンドライン引数として渡します。ルートのCMakeLists.txtファイルは、そのファイルでincludeを呼び出すだけです。

4
Alex Goldberg

サブディレクトリに含まれているCMakeLists.txtファイルを確認するのに役立ちますが、ファイルを作成するためのadd_executableまたはadd_libraryステートメントが含まれていると思います。
また、あなたの例のため、ターゲットに同じディレクトリ名を使用していると思います。
つまり、サブディレクトリのCMakeLists.txtファイルで定義されたシンボルは、親ディレクトリのCMakeLists.txtファイルのコンテキスト内ではデフォルトでは表示されないことを知っておく必要があります。そのため、サブディレクトリ内のCMakeLists.txtファイル内のinstallステートメントを移動する必要があります。
私の考えが正しかった場合、これで問題が解決するはずです。それ以外の場合は、上記の他のファイルのコンテンツも質問に投稿することを強くお勧めします。

とにかく、エラーはかなり明確です。
installという名前のターゲットのXステートメントを含むファイルには、そのターゲットを生成するターゲット作成ステートメント(add_executableなど)が含まれていませんなので、そのターゲットはそのディレクトリに存在しないと言い続けます。

3
skypjack
0
phcerdan