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

时间:2015-08-21 21:58:14

标签: c++ ubuntu cmake

我获得了一些源代码以及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

1 个答案:

答案 0 :(得分:4)

问题是FindOpenNI.cmakelink)中的这一行:

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)

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