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

5

我收到了一些源代码和一个名为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 是否是开源的?如果是的话,如果您能在这里提供链接,那将会非常有帮助。 - huu
是的 - 请查看我更新的问题。 - Karnivaurus
1个回答

5
这个问题出现在FindOpenNI.cmake文件的这一行中(链接):
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)

这将覆盖缓存值。请注意,这将阻止您在未来通过命令行设置选项,因此此方法不是首选。您可以在此处找到有关其工作原理的更多信息。


是的,那个有效,谢谢。我还必须确保在使用add_subdirectory()命令之前,在我的CMakeLists.txt文件中包含此定义,否则该变量将无法注册。 - Karnivaurus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接