cmake 变量和 cmake 参数之间的区别

Kar*_*rus 5 c++ ubuntu cmake

我已经获得了一些源代码和一个CMakeLists.txt文件,并被告知通过以下方式运行 cmake:

cmake ../src -DOPEN_NI_ROOT=/home/karnivaurus/OpenNI
Run Code Online (Sandbox Code Playgroud)

我还注意到有一个名为 的文件,我相信在cmake 调用FindOpenNI.cmake时会使用该文件。find_package(OpenNI)

因此,我猜测这OPEN_NI_ROOT是 cmake 用于其余设置的某种变量。

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

有人可以解释一下这两种变量类型有何不同吗?


该文件FindOpenNI.cmake是开源的,可以在以下位置找到: https: //github.com/victorprad/InfiniTAM/blob/master/InfiniTAM/cmake/FindOpenNI.cmake

huu*_*huu 5

问题是FindOpenNI.cmake链接)中的这一行:

set(OPEN_NI_ROOT "/usr/local" CACHE FILEPATH "Root directory of OpenNI2")
Run Code Online (Sandbox Code Playgroud)

OPEN_NI_ROOT除非它已经在缓存中,否则它将被设置。一个简单的调用:

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI")
Run Code Online (Sandbox Code Playgroud)

不会在缓存中设置变量,因此当命中行时它将被覆盖FindOpenNI.cmake。使用命令行形式设置变量其设置在缓存中,这就是它工作正常的原因。

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

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI" CACHE FILEPATH "Root directory of OpenNI2")
Run Code Online (Sandbox Code Playgroud)

如果您在脏构建目录中工作,则该缓存变量可能已经存在,因此该行将不起作用。在这种情况下,要么从干净的构建目录工作,要么设置选项FORCE

set(OPEN_NI_ROOT "/home/karnivaurus/OpenNI" CACHE FILEPATH "Root directory of OpenNI2" FORCE)
Run Code Online (Sandbox Code Playgroud)

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