67

当我构建一些第三方代码时,我看到来自 CMake 的以下警告:

CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_TOOLCHAIN_FILE

是什么导致了这个警告?我检查了配置文件,但找不到定义此变量的任何地方。

我应该担心这个警告吗?如何修复它以使警告消失?

4

4 回答 4

60

这是 CMake 在您为其提供未使用的命令行选项时生成的标准警告。例如,当 CMakeLists.txt 文件实际上不使用该变量时传递-DFOO=bar给该变量。cmakeFOO

现在,这是一种特殊情况:CMAKE_TOOLCHAIN_FILECMake 第一次配置您的构建时使用它,但是,由于您无法更改已配置构建的工具链,因此每隔一次都会忽略此变量;因此警告。

正如回答者在评论中指出的那样,您可以放心地忽略警告。Brad King 在 2011 年 2 月 7 日的 CMake 邮件列表中解释道

我只能通过在已经存在的构建树上运行 CMake 来实现这一点。变量 *does* 在 *first* 在新树中运行时使用。它*不会*稍后使用,因为您不需要指定它来重新生成。CMake 已经在 CMakeFiles/CMakeSystem.cmake 中记录了加载文件的规则,并且不支持更改现有构建树的工具链。

IOW,这是警告的合法实例。

如果这个警告真的困扰你,你有几个选项来抑制它:

  • 您可以在运行时传递该--no-warn-unused-cli选项cmake

    不过,这有点生硬,因为它会抑制来自命令行上指定的未使用变量的所有警告。这可能会隐藏一些合法的警告。

  • 您可以在第二次调用之前删除第一次调用 CMake 生成的临时文件。正如js 的评论中提到的那样。,您需要删除CMakeCache.txt文件和CMakeFiles文件夹。例如,通过执行:

     rm -rf CMakeCache.txt CMakeFiles/
    

    但是,正如javs 所说,这有点毫无意义。除非您实际更改工具链,否则没有理由删除这些生成的文件。尽管它确实使警告消失了,但它只是通过强制重新生成文件来做到这一点,这会浪费时间以获得最小的收益。

  • Roland Sarrazin 的回答给出了第三种选择(也许是最好的)。这涉及通过在状态消息中输出变量来简单地使用变量。这样,它就不会被使用,因此不会触发警告。您甚至可能会发现该消息对于调试与工具链配置相关的问题很有用。

于 2013-06-13T10:45:23.803 回答
12

Guillaume 的回答已经解释了您收到此特定未使用变量警告的原因。

绕过警告的一种简单而有用的方法(不删除由第一次调用 CMake 生成的临时文件)是在状态消息中使用该变量。例如:

MESSAGE(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}")
于 2018-07-20T14:10:16.907 回答
6

如果您在设置 选项使用 CLion 收到此消息-DCMAKE_TOOLCHAIN_FILE=xxx,您将需要删除所有 CMake 构建目录。

Tools-> CMake -> Show Generated CMake Files in File Manager

然后删除所有构建目录。然后做

Tools-> CMake -> Reload the CMake Project

执行此操作后,您仍然会收到警告,但至少在第一次运行 cmake 时会观察到它。

于 2016-05-05T00:15:52.607 回答
2

正如@js 指出的那样,这里也发生了同样的情况,这通常意味着您已经从过去的配置中构建了 cmake 的残余物。

执行 a rm -rf CMakeCache.txt CMakeFiles/,第一次执行 . 时消息将消失cmake -DCMAKE_TOOLCHAIN_FILE=foo.cmake .。第二次,他们将再次出现,正如@Guilaume 回答的那样,没关系。

PS:我首先做了一个git clean --force,但由于这些文件通常在 中.gitignore,因此不会重置构建。

于 2017-04-21T20:44:56.047 回答