2011-07-31 117 views
52

我在我的項目根目錄中有一個CMakeLists.txt,在我的/ src文件夾中有一個。/src文件夾中的文件夾只包含一個帶有.cpp文件(set (SOURCEFILES main.cpp foo.cpp))和根CMakeLists.txt的變量,我做add_subdirectory(src),後來我做了add_executable(MyApp ${SOURCEFILES})cmake變量作用域,add_subdirectory

但CMake的給我的錯誤

add_executable調用的參數數目不正確,不提供

我怎麼cmake的見到變量來源 ?我讀的cmake只知道全局變量,但是這顯然不是這樣的......

回答

78

由於set命令的文件中提到的,每個目錄添加add_subdirectoryfunction聲明的每個函數創建一個新的範圍。

新的子範圍從其父範圍繼承所有變量定義。使用set命令的新子範圍中的變量分配僅在子範圍內可見,除非使用PARENT_SCOPE選項。

要使SOURCEFILES分配在項目的根文件夾可見,請嘗試:

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

謝謝,這解決了這個問題。但是另一個需要注意的是:在子目錄中,您現在要使用'$ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp'而不是'foo.cpp',因爲cmake現在在父範圍內。 – blubberbernd

+2

或者,您可以在add_subdirectory調用之前在父CMakeLists.txt文件中設置變量,並將其定義繼承到子CMakeLists文件。同樣,如果您需要從多個CMakeLists文件中引用它們,則需要限定這些文件的名稱。 – DLRdave

+5

您還需要在當前範圍內創建變量,以在子目錄/函數中使用其值:'set(VAR value PARENT_SCOPE);設置(VAR $ {VAR});' –