【问题标题】:cmake variable scope, add_subdirectorycmake 变量范围,add_subdirectory
【发布时间】:2021-10-24 13:19:05
【问题描述】:

我的项目根目录中有一个 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只知道全局变量,但显然不是这样......

【问题讨论】:

    标签: scope cmake


    【解决方案1】:

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

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

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

    set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
    

    【讨论】:

    • 谢谢,这解决了。但另一个注意事项:在子目录中,您现在必须使用 ${CMAKE_CURRENT_SOURCE_DIR}/foo.cpp 而不仅仅是 foo.cpp,因为 cmake 现在位于父范围内。
    • 或者,您可以在调用 add_subdirectory 之前在父 CMakeLists.txt 文件中设置变量,并将其定义继承到子 CMakeLists 文件。同样,如果您需要从多个 CMakeLists 文件中引用它们,则需要限定文件的名称。
    • 您还需要在当前作用域中创建变量以在子目录/函数中使用其值:set(VAR value PARENT_SCOPE); set(VAR ${VAR});
    • @PatrickB。在我的情况下,set(VAR value PARENT_SCOPE); set(VAR ${VAR}); 不起作用,但是,set(VAR value); set(VAR ${VAR} PARENT_SCOPE); 起作用。
    • 另外,您可以从父目录访问 suddir 中的特定变量,例如 get_directory_property(VAR1 DIRECTORY subdir1 DEFINITION VAR1)
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多