以下を検討してください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
execA
とlibB
には独自のCMakeList.txt
ファイルはproject
ディレクトリの下にあります。また、私が実行しているビルドディレクトリcmake
(cmake ..
):
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 ..
このエラーを修正するにはどうすればよいですか?
このバグレポート によると、install(TARGETS)
コマンドフローは、同じディレクトリ内に作成されたターゲットのみを受け入れます。
そのため、add_library()
呼び出しを最上位のディレクトリに移動するか、install(TARGETS)
呼び出しをターゲットごとの呼び出しに分割し、それぞれを対応するサブディレクトリに移動する必要があります。
CMake 3.13以降install(TARGETS)
can can 他のディレクトリに作成されたターゲットでも。
install(TARGETS)
は、他のディレクトリに作成されたターゲットをインストールできます。このようなクロスディレクトリインストールルールを使用する場合は、make install
(または類似の)サブディレクトリからの場合、他のディレクトリからのターゲットが最新であることは保証されません。
これはまだCMake 3.11の問題点のようです。
私たちのコードベースでは、多くのターゲットがサブディレクトリで定義されており、異なる構成とターゲットの(重複する可能性のある)組み合わせでインストーラーの品揃えを作成する必要があります。
これが私の解決策です:
add_subdirectory
を呼び出す前に、インストーラーに含めるターゲットの名前を指定してGLOBAL
プロパティを作成します。add_executable
など)をラップします。これらの関数内で、ターゲットがグローバルプロパティに存在するかどうかを確認し、それに応じてinstall
を呼び出します。このアプローチにより、インストーラー構成を集中化できます。
また、複数のインストーラーの作成をサポートするために、個別の.cmakeファイルに他のインストーラープロパティと共にグローバルリストを入力します。 cmake
を呼び出すときに、インストーラー構成のCMakeファイルの名前をコマンドライン引数として渡します。ルートのCMakeLists.txtファイルは、そのファイルでinclude
を呼び出すだけです。
サブディレクトリに含まれているCMakeLists.txt
ファイルを確認するのに役立ちますが、ファイルを作成するためのadd_executable
またはadd_library
ステートメントが含まれていると思います。
また、あなたの例のため、ターゲットに同じディレクトリ名を使用していると思います。
つまり、サブディレクトリのCMakeLists.txt
ファイルで定義されたシンボルは、親ディレクトリのCMakeLists.txt
ファイルのコンテキスト内ではデフォルトでは表示されないことを知っておく必要があります。そのため、サブディレクトリ内のCMakeLists.txt
ファイル内のinstall
ステートメントを移動する必要があります。
私の考えが正しかった場合、これで問題が解決するはずです。それ以外の場合は、上記の他のファイルのコンテンツも質問に投稿することを強くお勧めします。
とにかく、エラーはかなり明確です。install
という名前のターゲットのX
ステートメントを含むファイルには、そのターゲットを生成するターゲット作成ステートメント(add_executable
など)が含まれていませんなので、そのターゲットはそのディレクトリに存在しないと言い続けます。
これは3.13で解決されています。 install:別のディレクトリに作成されたターゲットのインストールを許可する