【发布时间】:2015-12-22 14:41:40
【问题描述】:
我对 cmake 的范围规则有点困惑。 我确实有类似的文件和目录
├── test
│ CMakeLists.txt
│ ├── cmake
│ │ MyCMake
│ │ MyCMake2
│ ├── child
│ │ CMakeLists.txt
内容是:
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})
子/CMakeLists.txt:
set(YOUR_NAME YourName)
set(HIS_NAME HisName PARENT_SCOPE)
message("Child: " ${MY_NAME} " " ${YOUR_NAME} " " ${HIS_NAME})
测试/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
这第一行没问题,第二个和第三个变量还没有定义。 对于第二行,它看起来像是一个仅限父级的设置,即定义的变量仅在父级中具有范围。 (所以,我可以/应该在本地范围内使用相同的变量?)第三行仅显示具有父范围的变量,好的。第 4 行显示我设置了 LOCAL 范围变量。但是,在第 5 行中,我看到 PARENT 范围值已更改,我希望仅在子目录中本地更改该值。 这里发生了什么? (看起来我可以覆盖变量的值,这不在我的范围内)
为什么我开始实验:在某些情况下,我在父目录中看不到子目录中定义的变量(如包含目录、库名称等)。有没有一种标准的方法可以在一个孩子中使用库名称来构建,并在另一个孩子中使用相同的名称进行链接?
还有一个问题:我有一个应用程序,由一个库和一个可执行文件组成。看起来 CMake 不允许对两者使用相同的目标名称。在我看来,如果我对二进制目标和库目标都使用名称“A”,则不会造成混淆,因为真正的第二个目标是“libA”。我错了吗?
【问题讨论】:
标签: cmake