cmake变量和cmake参数的区别

Difference between cmake variables and cmake arguments

本文关键字:cmake 区别 变量 参数      更新时间:2023-10-16

我得到了一些源代码,以及一个CMakeLists.txt文件,并告诉运行cmake:

cmake ../src -DOPEN_NI_ROOT=/home/karnivaurus/OpenNI

我还注意到有一个名为FindOpenNI.cmake的文件,我认为当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

问题是FindOpenNI.cmake (link)中的这一行:

set(OPEN_NI_ROOT "/usr/local" CACHE FILEPATH "Root directory of OpenNI2")

这将设置OPEN_NI_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)

这将重写缓存的值。注意,这将阻止您将来在命令行中设置该选项,这就是为什么不推荐使用此方法的原因。您可以在这里找到有关此机制的更多信息。