2011-07-31 17 views
52

プロジェクトルートにCMakeLists.txt、my/srcフォルダにCMakeLists.txtがあります。/srcフォルダ内のファイルには.cppファイル(set (SOURCEFILES main.cpp foo.cpp))の変数のみが含まれています。ルートCMakeLists.txtにはadd_subdirectory(src)があり、後ではadd_executable(MyApp ${SOURCEFILES})です。cmake変数スコープ、add_subdirectory

しかし、cmakeのが私の引数の数が正しくありませんと呼ばれるエラー

add_executableを与え、何のソース は、私は、変数を参照するためにcmakeのを取得するにはどうすればよい

ありませんか? setコマンドのドキュメントで述べたように、私はcmakeのが唯一のグローバル変数を知っていることを読んで、それは明らかにそうではないのです...

答えて

78

、各ディレクトリはadd_subdirectoryを追加またはfunctionで宣言された各機能は、新しいスコープを作成します。

新しい子スコープは、すべての変数定義を親スコープから継承します。 setコマンドを使用する新しい子スコープの変数割り当ては、PARENT_SCOPEオプションが使用されていない限り、子スコープでのみ表示されます。

、プロジェクトのルートフォルダに表示SOURCEFILES割り当てを作るしようとするには、次の

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
+2

おかげで、これはそれを解決しました。しかしもう一つの注意:cmakeが親スコープにあるので、サブディレクトリで 'foo.cpp'の代わりに' $ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp'を使用するようになりました。 – blubberbernd

+2

また、add_subdirectoryコールの前に親CMakeLists.txtファイルに変数を設定し、その定義を子CMakeListsファイルに継承させることもできます。ここでも、複数のCMakeListsファイルから参照する必要がある場合は、ファイルの名前を修飾する必要があります。 – DLRdave

+5

サブdir /関数の値を使用するには、変数をカレントスコープで作成する必要があります。 'set(VAR value PARENT_SCOPE);セット(VAR $ {VAR}); ' –