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

CMake SET command not working as expected (CMake not setting value of predefined cached variable)

我在构建中使用 CMake。我正在尝试像这样设置编译器标志:

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

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

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

有人可以指出发生了什么事吗?

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

现在,当你这样做时:

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

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

来自set documentation。 (文档叫"normal"我叫"local")

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 界面完成,也可以在 cmake 命令行中添加类似 -DCMAKE_BUILD_TYPE=Debug-DCMAKE_BUILD_TYPE=Release 的内容。