gpt4 book ai didi

CMake SET 命令未按预期工作(CMake 未设置预定义缓存变量的值)

转载 作者:行者123 更新时间:2023-12-02 07:47:44 27 4
gpt4 key购买 nike

我在构建中使用 CMake。我正在尝试设置编译器标志,如下所示:

set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")

但是,我的构建失败,因为未设置编译器标志之一。

当我检查 CMake-GUI 中变量的值为空时:

enter image description here

有人能指出发生了什么吗?

最佳答案

使用 cmake-gui 看到的是缓存状态。您只能看到显式缓存的变量,或预定义的 cmake 缓存变量。

现在,当你这样做时:

set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")

您正在做一些特殊的事情:您正在设置一个“本地”(未缓存)变量,该变量与预定义的 cmake 缓存变量具有相同的名称。在 C++ 中,这就像定义一个与全局变量同名的局部变量:局部变量将隐藏全局变量。

来自set documentation 。 (文档中将“正常”称为“本地”)

Both types can exist at the same time with the same name but different values. When ${FOO} is evaluated, CMake first looks for a normal variable 'FOO' in scope and uses it if set. If and only if no normal variable exists then it falls back to the cache variable 'FOO'.

您已经有效地设置了 CMAKE_C_FLAGS_DEBUG,编译器将使用您指定的标志。您可以通过以下方式检查:

message(STATUS "CMAKE_C_FLAGS_DEBUG = ${CMAKE_C_FLAGS_DEBUG}")

所以,您的建筑因另一个原因而失败。检查 make 生成哪个命令行:make VERBOSE=1

顺便说一句,我建议您将您的标志附加到预定义的标志中,方法是:

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -option1 -option2 -option3")

如果您希望将这些设置传播到所有构建类型,还可以考虑使用其他预定义变量CMAKE_C_FLAGS

<小时/> 编辑:
经过一些迭代后,发现问题是构建类型 ( CMAKE_BUILD_TYPE) 不是从 cmake 设置的。这可以通过 cmake-gui 界面完成,也可以将 -DCMAKE_BUILD_TYPE=Debug-DCMAKE_BUILD_TYPE=Release 之类的内容添加到 cmake 命令行。

关于CMake SET 命令未按预期工作(CMake 未设置预定义缓存变量的值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29735931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com