1. ホーム
  2. Qt

CMake: add_subdirectory()

2022-02-26 17:01:14

ある開発シナリオ。プロジェクトAはライブラリファイルを出力し、プロジェクトBは実行ファイルを出力するがAの出力に依存し、CMakeを使用して2つのファイルを整理する。


オプション1:

2つのプロジェクトが独立してコンパイルし、Aの出力を固定ディレクトリにインストールし、プロジェクトBがそのディレクトリに行って依存関係を解決する場合、find_library()を使用することができます。


オプション 2:

スクリプトを使用、基本的にはオプション1と同じですが、キーボード操作を大幅に減らすスクリプトを使用します


上記のシナリオは両方とも、プロジェクトBを構成するときに、プロジェクトAの出力ライブラリファイルが既に存在することを前提としています。そうでない場合、find_library()はエラーを表示します。

プロジェクト A がコンパイルされる前にプロジェクト B を正常にコンパイルする、つまり、CMake でプロジェクト B がプロジェクト A に依存していることを指定するのですか?

オプション 3:

プロジェクトBのCMakeLists.txtでADD_SUBDIRECTORY()を使用します。

プロジェクトAがプロジェクトBのディレクトリ構造にない場合、プロジェクトAの出力先であるbinary_dirを指定する必要があります

依存関係がBプロジェクトのディレクトリ構造にない場合、Aプロジェクトの出力パスであるbinary_dirを指定する必要があります。

libのフルネームではなく、プロジェクトAの${PROJECT_NAME}のフルネーム)



オプション3への追加。

プロジェクトAはBとCに依存し、BとCはともにDに依存しています。BとCの両方でADD_SUBDIRECTORY()を使用してDを追加すると、Aをコンパイルするときにエラーになってしまいます。

同じ名前のターゲットがすでに存在するため、ターゲット "D"を作成できません。

解決策は、BとCでtarget属性を使用することです

if (NOT TARGET D)
    add_subdirectory( DRoot D)
endif() 





Dが繰り返し含まれないようにする