cmake变量范围,add_subdirectory


76

我在项目根目录中有一个CMakeLists.txt,在/ src文件夹中有一个。/ src文件夹中的一个仅包含具有.cpp文件(set (SOURCEFILES main.cpp foo.cpp))的变量,并且在我做的根目录CMakeLists.txt中包含add_subdirectory(src),以后再执行add_executable(MyApp ${SOURCEFILES})

但是cmake给我错误

使用错误的参数数量调用了add_executable,未提供任何源

我如何获得cmake来查看变量?我读到cmake只知道全局变量,但事实并非如此……

Answers:


114

set命令的文档所述,添加了目录的每个目录add_subdirectory或声明了每个函数的目录都会function创建一个新的作用域。

新的子作用域从其父作用域继承所有变量定义。set除非使用该PARENT_SCOPE选项,否则使用该命令在新的子作用域中的变量分配将仅在子作用域中可见。

要使SOURCEFILES分配在项目的根文件夹中可见,请尝试:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 

5
谢谢,这解决了。但请注意:在子目录中,您现在必须使用${CMAKE_CURRENT_SOURCE_DIR}/foo.cpp而不是仅foo.cpp因为cmake现在位于父作用域中。
blubberbernd 2011年

2
或者,您可以在add_subdirectory调用之前在父CMakeLists.txt文件中设置变量,并将其定义继承到子CMakeLists文件。同样,如果需要从多个CMakeLists文件中引用它们,则需要限定文件名。
DLRdave 2011年

8
您还需要在current-scope中创建变量,以在子目录/函数中使用其值:set(VAR value PARENT_SCOPE); set(VAR ${VAR});
Patrick B.

9
@帕特里克·B。就我而言,这set(VAR value PARENT_SCOPE); set(VAR ${VAR});是行不通的set(VAR value); set(VAR ${VAR} PARENT_SCOPE);
德庆

5
另外,您可以像这样从父目录访问suddir中的特定变量get_directory_property(VAR1 DIRECTORY subdir1 DEFINITION VAR1)
Maxim Suslov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.