CMake中目标与变量的作用域是否存在差异?
CMake中目标与变量的作用域差异
是的,CMake里目标和变量的作用域规则完全不同,这就是你遇到问题的核心原因:
变量的作用域规则
add_subdirectory会创建一个独立的子作用域,子目录CMakeLists.txt中默认定义的变量仅存在于该子作用域内,父作用域(顶层CMakeLists.txt)无法直接访问。
你在MathFunctions子目录里用set(MyString "Some Text")定义变量时,没有指定PARENT_SCOPE参数,因此这个变量仅在子作用域生效。顶层的message(STATUS "${MyString}")会输出空值(若顶层未提前定义过MyString)。
如果要让父作用域访问该变量,需修改子目录的set命令:
set(MyString "Some Text" PARENT_SCOPE)
目标的作用域规则
CMake中通过add_library、add_executable等命令创建的目标属于全局作用域,一旦创建成功,整个项目内所有后续的CMake代码(包括父目录、其他子目录)都可直接引用该目标,无需额外的作用域传递操作。
因此你在MathFunctions子目录里创建的MathFunctions库目标,顶层CMakeLists.txt能直接在target_link_libraries中引用,不需要任何额外设置。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

