3

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

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

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

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

在此处输入图像描述

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

4

1 回答 1

4

您使用 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东西。

于 2015-04-19T21:36:08.753 回答