我在构建中使用CMake。我正在尝试设置这样的编译器标志:
set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")
但是,我的构建失败,因为没有设置其中一个编译器标志。
当我检查CMake-GUI中的变量值为空时:
有人可以指出发生了什么吗?
答案 0 :(得分:4)
你用cmake-gui看到的是缓存状态。您只看到显式缓存的变量或预定义的cmake缓存变量。
现在,当你这样做时:
set(CMAKE_C_FLAGS_DEBUG "-option1 -option2 -option3")
你正在做一些特别的事:你正在设置一个"本地" (未缓存)变量,其名称与预定义的cmake缓存变量相同。在C ++中,它就像定义一个具有全局变量名称的局部变量:局部变量将隐藏您的全局变量。
来自set
documentation。 (文档调用"正常"我称之为"本地")
两种类型可以同时存在,但名称相同但不同 值。当评估$ {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
之类的内容。