ChatGPT解决这个技术问题 Extra ChatGPT

cmake 变量范围,add_subdirectory

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


R
Razakhel

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)

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅