我获得了一些源代码以及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
答案 0 :(得分:4)
问题是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)
这将覆盖缓存的值。请注意,这将阻止您在将来在命令行中设置选项,这就是为什么不首选此方法的原因。您可以找到有关此here的机制的更多信息。