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