C++ cmake变量和cmake参数之间的差异

C++ cmake变量和cmake参数之间的差异,c++,ubuntu,cmake,C++,Ubuntu,Cmake,我收到了一些源代码以及CMakeLists.txt文件,并被告知通过以下方式运行cmake: cmake ../src -DOPEN_NI_ROOT=/home/karnivaurus/OpenNI 我还注意到有一个名为FindOpenNI.cmake的文件,我相信当cmake调用find\u package(OpenNI)时会用到这个文件 因此,我猜测OPEN\u NI\u ROOT是cmake在其余设置中使用的某种变量 但是,我尝试将行set(OPEN_NI_ROOT)/home/karn

我收到了一些源代码以及
CMakeLists.txt
文件,并被告知通过以下方式运行cmake:

cmake ../src -DOPEN_NI_ROOT=/home/karnivaurus/OpenNI
我还注意到有一个名为
FindOpenNI.cmake
的文件,我相信当cmake调用
find\u package(OpenNI)
时会用到这个文件

因此,我猜测
OPEN\u NI\u ROOT
是cmake在其余设置中使用的某种变量

但是,我尝试将行
set(OPEN_NI_ROOT)/home/karnivaurus/OpenNI)
插入到我的
CMakeLists.txt
文件中,以避免在命令行中将其作为参数添加。但这似乎并没有起到同样的作用

有人能解释一下这两种变量类型有什么不同吗


文件
FindOpenNI.cmake
是开源的,可以在以下位置找到:
问题是
FindOpenNI.cmake
()中的这一行:

这将设置
OPEN\u NI\u ROOT
,除非它已经在缓存中。一个简单的调用:

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI")
不在缓存中设置变量,因此当命中
FindOpenNI.cmake
中的行时,它将被重写。使用命令行形式设置变量将在缓存中设置它,这就是它工作正常的原因

避免设置命令行选项的最简单方法是在自己的
CMakeLists.txt
中显式设置缓存:

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI" CACHE FILEPATH "Root directory of OpenNI2")
如果您使用的是脏的构建目录,那么这个缓存变量很可能已经存在,所以这一行不会有任何效果。在这种情况下,可以从干净的生成目录工作,也可以设置
FORCE
选项:

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI" CACHE FILEPATH "Root directory of OpenNI2" FORCE)

这将覆盖缓存的值。请注意,这将阻止您将来在命令行中设置选项,这就是为什么不首选此方法的原因。你可以找到更多关于这个机制的信息。

这个
FindOpenNI.cmake
是开源的吗?如果是的话,如果你能把它链接到这里会有很大的帮助。是的——请看我的最新问题……是的,很有效,谢谢。在使用
add_subdirectory()
命令之前,我还必须确保将此定义包含在我的
CMakeLists.txt
文件中,否则变量不会被注册。
set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI" CACHE FILEPATH "Root directory of OpenNI2" FORCE)