我没有使用命令行和-D
标志来设置变量,而是在CMakeLists.txt中使用set()
来进行简单的“初学者”单目录项目。优点是每次调用cmake -DVARIABLE_NAME=path/to/infinity/and/beyond ..
时不必记住和/或复制并粘贴长目录名
我的问题是这两种方法在功能上有什么区别,在哪些简单的用例中,我可能不想使用set
而不是命令行-D
标志?
相关问题
这个答案讨论了cmake中变量的作用域,可能包含了我问题的答案,但它太复杂了,我无法理解:What's the CMake syntax to set and use variables?
这个答案提供了一个用例,其中两个方法不相同,但用于一些我不了解的特定变量和库,因此无法联系起来:Setting "-D" variables inside CMake
**注意:**我的问题没有特定的上下文,但受到以下this pytorch tutorial的启发,以设置我的第一个C++项目并使用pytorch。
2条答案
按热度按时间xpszyzbs1#
-D
将变量设置为 cache variables(参见Mastering CMake chapter和variables docs),这意味着即使它们没有在配置文件中设置,它们也会被记住。您可以选择指定类型。如果将类型设置为PATH
或FILEPATH
,则值将转换为绝对路径。set
设置变量。您可以传递CACHE
以将该变量设置为缓存变量。您还可以使用TYPE
参数设置类型。非缓存变量的作用域为块、函数和目录作用域(docs)。你可以指定一个类型,也可以指定一个文档字符串。缓存和非缓存变量都可以使用相同的语法引用(文档和相关的细微差别:policy CMP0126)。
一般来说,如果您认为构建您的项目的人可能希望控制该变量,那么您应该让用户使用
-D
,并通过使用set(... CACHE ...)
在CMakeLists.txt中设置“默认值”。请注意,对于潜在的非缓存变量,您可以使用if(DEFINED ...)
进行类似的操作,以便有条件地只设置尚未设置的变量。我在my answer to "CMakePresets.json vs CMakeSettings.json vs CMakeLists.txt"中也写过这个。如果变量是布尔值,则有一个用于定义缓存变量的速记命令:option
。优点是每次调用cmake [...]时不必记住和/或复制和粘贴长目录名。
请注意,大多数shell都具有历史记录功能,因此您可以调用过去执行过的命令。实际上,CMake's Preset feature听起来正合你的口味。您可以创建一个用户本地的CMakeUserPresets.json文件(将其放在您的.gitignore中),完全适合您的个人需求。请注意,如果您要调用CMake来重新配置和重新生成一个已经配置和生成的buildsystem,以更改缓存变量,有几个工具也可以让您更轻松,包括捆绑的交互式对话框
cmake-gui
和ccmake
。qij5mzcb2#
在CMakeLists.txt中使用set默认设置标志,用户不必使用-D指定它。在功能上,它们的作用相同,有点像C/C++中的#define和-D。