为什么我被警告项目不使用"CMAKE_TOOLCHAIN_FILE"变量?



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

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

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

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

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

现在,这是一个有点特殊的情况:CMake在第一次配置您的构建时使用CMAKE_TOOLCHAIN_FILE,但是,由于您无法更改已配置构建的工具链,因此每隔一次就会忽略此变量;因此发出警告。

正如Answer在评论中指出的那样,您可以安全地忽略警告。Brad King于2011年2月7日在CMake邮件列表上解释道:

我只能通过在已经存在。变量*在新树中的第一次运行中使用。它稍后不会被使用,因为您不需要将其指定为使振兴CMake已经录制了一个规则以将文件加载到CMakeFiles/CMakeSystem.cmake,不支持更改工具链现有生成树的。

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

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

  • 运行cmake时,可以传递--no-warn-unused-cli选项。

    不过,这有点生硬,因为它会抑制命令行上指定的未使用变量发出的所有警告。这可能掩盖了一些合理的警告。

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

     rm -rf CMakeCache.txt CMakeFiles/
    

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

  • 罗兰·萨拉辛给出了第三种选择(也许也是最好的选择)。这只需要通过在状态消息中输出变量来使用。这样,它就不会被使用,因此不会触发警告。您甚至可能发现该消息对于调试与工具链配置相关的问题非常有用。

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

在不删除第一次调用CMake生成的临时文件的情况下,规避警告的一种简单而有用的方法是在状态消息中使用变量。例如:

MESSAGE(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}")

如果您在之后通过CLion收到此消息,请设置-DCMAKE_TOOLCHAIN_FILE=xxx选项,则需要删除所有CMake构建目录。

进行

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

然后删除所有生成目录。然后进行

Tools-> CMake -> Reload the CMake Project

一旦你这样做了,你仍然会得到警告,但至少在第一次运行cmake时会观察到。

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

做一个rm -rf CMakeCache.txt CMakeFiles/,第一次做cmake -DCMAKE_TOOLCHAIN_FILE=foo.cmake .时消息就会消失。第二次,他们会再次出现,正如@Guilaume所回答的,没关系。

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

通过输出Roland Sarrazin建议的CMAKE_TOOLCHAIN_FILE值来规避警告是一个聪明的解决方案。但是,由于在初始配置之后不可能更改工具链,因此警告可能是合法的。如果用户尝试设置以前配置中使用的不同CMAKE_TOOLCHAIN_FILE,那么我们只会收到警告,这将是理想的选择。这可以通过创建一个保存初始值的秘密缓存变量来实现。

if(DEFINED _initial_CMAKE_TOOLCHAIN_FILE
   AND NOT _initial_CMAKE_TOOLCHAIN_FILE STREQUAL CMAKE_TOOLCHAIN_FILE)
  message(WARNING "The CMAKE_TOOLCHAIN_FILE cannot be changed")
elseif(DEFINED CMAKE_TOOLCHAIN_FILE)
  set(_initial_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" CACHE INTERNAL "")
endif()

由于逻辑使用CMAKE_TOOLCHAIN_FILE的值,因此避免了CMAKE警告,并由我们更有针对性的警告取代。

最新更新