cmake变量范围,add_subdirectory

blu*_*rnd 65 scope cmake

我的项目根目录中有一个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只知道全局变量,但显然并非如此......

sak*_*kra 100

set命令的文档中所述,添加的每个目录add_subdirectory或声明的每个函数function都会创建一个新范围.

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

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

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
Run Code Online (Sandbox Code Playgroud)

  • @PatrickB.在我的情况下`set(VAR值PARENT_SCOPE); set(VAR $ {VAR});`不工作,但是,set(VAR值); set(VAR $ {VAR} PARENT_SCOPE);`有效. (8认同)
  • 您还需要在current-scope中创建变量,以便在sub-dir/function中使用它的值:`set(VAR value PARENT_SCOPE); set(VAR $ {VAR});` (7认同)
  • 谢谢,这解决了它.但另一个注意事项:在子目录中,您现在使用`$ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp`而不是`foo.cpp`,因为cmake现在位于父范围内. (5认同)
  • Additonaly你可以从父目录访问suddir中的特定变量,比如这个`get_directory_property(VAR1 DIRECTORY subdir1 DEFINITION VAR1)` (5认同)
  • 或者,您可以在add_subdirectory调用之前在父CMakeLists.txt文件中设置该变量,并将其定义继承到子CMakeLists文件.同样,如果需要从多个CMakeLists文件中引用它们,则需要限定文件的名称. (2认同)