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
的内容。
我在构建中使用 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
的内容。