cmake变量和cmake参数的区别
Difference between cmake variables and cmake arguments
我得到了一些源代码,以及一个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)
这将重写缓存的值。注意,这将阻止您将来在命令行中设置该选项,这就是为什么不推荐使用此方法的原因。您可以在这里找到有关此机制的更多信息。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用CMake创建QML插件
- int(c) 和 c-'0' 之间的区别。C++
- cmake如何在fedora工作站中找到boost静态库包
- 使用CMake检测支持的C++标准
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- cmake在我的项目中所需的所有静态库都不成功
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 无法链接 CMake 中的本地库
- cMake中的pthread和-pthread选项有什么区别?
- 在CMake中,命令SUBDIRS()和ADD_SUBDIRECTORY()有什么区别
- cmake变量和cmake参数的区别
- CMake和NDK-build在android studio项目中的区别
- CMake中的include_directories和target_include_directories有什么区别?