我对cmake的作用域规则有些困惑。 我确实有文件和目录,如下所示:
├── test
│ CMakeLists.txt
│ ├── cmake
│ │ MyCMake
│ │ MyCMake2
│ ├── child
│ │ CMakeLists.txt
The contents are:
cmake/MyCMake:
set(MY_NAME MyName)
message("MyCMake: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
cmake/MyCMake2:
set(HIS_NAME NewName)
message("MyCMake2: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
child/CMakeLists.txt:
set(YOUR_NAME YourName)
set(HIS_NAME HisName PARENT_SCOPE)
message("Child: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
test/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(MyCMake)
add_subdirectory(child)
message("Parent1: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
include(MyCMake2)
message("Parent2: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
结果是:
MyCMake: MyName
Child: MyName YourName
Parent1: MyName HisName
MyCMake2: MyName NewName
Parent2: MyName NewName
第一行没问题,第二行和第三个变量还没有定义。第二行显示它似乎是仅父级设置,即定义的变量仅在父级中具有作用域。(那么,我可以/应该使用具有本地作用域的相同变量吗?)第三行仅显示具有父级作用域的变量,没问题。第四行显示我设置了一个本地作用域变量。然而,在第五行中,我看到父级作用域值已经改变了,而我希望它仅在子目录中局部更改。
这里发生了什么?(看起来我可以覆盖不在我的作用域内的变量的值)
为什么我开始尝试:在某些条件下,我在父目录中看不到在子目录中定义的变量(例如包含目录、库名称等)。是否有标准方法在一个子目录中使用库名称进行构建,并在另一个子目录中使用相同的名称进行链接?
还有一个问题:我有一个应用程序,由库和可执行文件组成。看起来CMake不允许同时为两者使用相同的目标名称。在我看来,如果我将名称“ A”用于二进制目标和库目标,这不应该导致混淆,因为真正的第二个目标是“ libA”。我错了吗?