使用 PARENT_SCOPE 设置的变量在相应的子作用域中为空。为什么?

2024-01-13

考虑以下最小示例:

.
├── bar
│   └── CMakeLists.txt
└── CMakeLists.txt

where ./CMakeLists.txt is

project( foo )
cmake_minimum_required( VERSION 2.8 )

set( FOO "Exists in both, parent AND in child scope." )

add_subdirectory( bar )
message( STATUS "Variable BAR in ./     = ${BAR}" )
message( STATUS "Variable FOO in ./     = ${FOO}" )

and ./bar/CMakeLists.txt is

set( BAR "Exists in parent scope only." PARENT_SCOPE )
message( STATUS "Variable BAR in ./bar/ = ${BAR}" )

输出的相关部分cmake这是:

...
-- Variable BAR in ./bar/ =
-- Variable FOO in ./bar/ = Exists in both, parent AND in child scope.
-- Variable BAR in ./     = Exists in parent scope only.
-- Variable FOO in ./     = Exists in both, parent AND in child scope.
...

由于变量BAR被放置到父作用域中,我希望它在当前子作用域中也可用(以及在随后的子作用域中)——就像变量一样FOO,它首先定义为父作用域。但从上面几行可以看出 多变的BAR是空的./bar/CMakeLists.txt,这让我 以下问题:

为什么是modified父作用域无法在子作用域中立即访问 范围,./bar/?这种情况可以缓解吗?如果是,怎么办?如果不是,什么是 解决方法?或者我完全错过了一些明显的东西?

上下文:我的项目由多个可执行文件和库组成。为一个 图书馆,例如bar,我想设置一个变量bar_INCLUDE_DIR哪个 添加到任何相关可执行文件的包含路径中,即target_include_directories( my_target PUBLIC bar_INCLUDE_DIR ).


我没有看到任何与此不符的内容SET命令文档 http://www.cmake.org/cmake/help/latest/command/set.html

如果 PARENT_SCOPE 存在,则变量将设置在当前范围之上的范围中。每个新目录或函数都会创建一个新范围。此命令会将变量的值设置到父目录或调用函数中(以适用于当前情况的为准)。

./bar/CMakeLists.txt

set( BAR "This is bar." PARENT_SCOPE ) #<-- Variable is set only in the PARENT scope
message( STATUS "Variable BAR in ./bar/ = ${BAR}" ) #<--- Still undefined/empty

你总是可以这样做:

set( BAR "This is bar." ) #<-- set in this scope
set( BAR ${BAR} PARENT_SCOPE ) #<-- set in the parent scope too

查找PARENT_SCOPE例如,在您安装的交付模块中FindGTK2 https://github.com/Kitware/CMake/blob/master/Modules/FindGTK2.cmake

if(GTK2_${_var}_FOUND)
   set(GTK2_LIBRARIES ${GTK2_LIBRARIES} ${GTK2_${_var}_LIBRARY})
   set(GTK2_LIBRARIES ${GTK2_LIBRARIES} PARENT_SCOPE)
endif()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PARENT_SCOPE 设置的变量在相应的子作用域中为空。为什么? 的相关文章

随机推荐