c++ 在CMake中使用-D标志和使用set()有什么区别?

camsedfj  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(547)

我没有使用命令行和-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。

xpszyzbs

xpszyzbs1#

-D将变量设置为 cache variables(参见Mastering CMake chapter和variables docs),这意味着即使它们没有在配置文件中设置,它们也会被记住。您可以选择指定类型。如果将类型设置为PATHFILEPATH,则值将转换为绝对路径。
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-guiccmake

qij5mzcb

qij5mzcb2#

在CMakeLists.txt中使用set默认设置标志,用户不必使用-D指定它。在功能上,它们的作用相同,有点像C/C++中的#define和-D。

相关问题