我在我的构建中使用 CMake。我正在尝试像这样设置编译器标志:
set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")
但是,我的构建失败,因为未设置编译器标志之一。
当我检查 CMake-GUI 中变量的值为空时:
有人可以指出发生了什么吗?
您使用 cmake-gui 看到的是缓存状态。您只会看到显式缓存的变量或预定义的 cmake 缓存变量。
现在,当你这样做时:
set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")
您正在做一些特别的事情:您正在设置一个“本地”(未缓存)变量,该变量与预定义的 cmake 缓存变量具有相同的名称。在 C++ 中,这就像定义一个与全局变量同名的局部变量:局部变量将隐藏您的全局变量。
从set
文档中。(文档称“正常”,我称之为“本地”)
两种类型可以同时存在,名称相同但值不同。当 ${FOO} 被评估时,CMake 首先在范围内寻找一个普通变量 'FOO' 并在设置时使用它。当且仅当不存在正常变量时,它才会回退到缓存变量“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
东西。