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

时间:2015-04-19 21:11:30

标签: cmake cflags

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

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

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

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

enter image description here

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

1 个答案:

答案 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之类的内容。