cmake 作用域对目标和变量的行为是否不同?

vzgqcmou  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(143)

我有一个父CMake文件,其中包含,

if(USE_MYMATH)
  add_subdirectory(MathFunctions)
  list(APPEND EXTRA_LIBS MathFunctions)

  message(STATUS "${MyString}")
endif()

# ...

target_link_libraries(compute_square_root PUBLIC 
  ${EXTRA_LIBS} tutorial_compiler_flags
)

在数学函数的CMakeLists.txt中包含,

add_library(MathFunctions mysqrt.cxx)

target_include_directories(MathFunctions
  INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)

set(MyString "Some Text")
message(STATUS "${MyString}")

我对作用域感到困惑。这里似乎target_link_libraries可以正确地引用子CMakeLists.txt在运行add_subdirectory(MathFunctions)时创建的目标(特别是add_library(MathFunctions mysqrt.cxx)),但是,它不能正确地访问也在同一作用域(MyString)中创建的变量。
目标和变量的作用域是否不同?

xqkwcwgp

xqkwcwgp1#

是的,它们的作用域不同。目标在定义后的任何作用域都可见。常规(非缓存)变量的作用域为目录和函数,并且仅对同一目录和函数作用域中的脚本代码可见(相同的函数作用域,相同的目录级别,或者add_subdirectory添加的子目录)。要在父目录的作用域中定义变量,必须像set(<variable> <value>... PARENT_SCOPE)那样定义它。有关详细信息,请参阅the set() command的文档。
如果要将变量的定义“传递”到多个作用域,则必须多次调用set(... PARENT_SCOPE),以向上传递每个作用域级别。

相关问题