当我构建一些第三方代码时,我看到来自 CMake 的以下警告:
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_TOOLCHAIN_FILE
是什么导致了这个警告?我检查了配置文件,但找不到定义此变量的任何地方。
我应该担心这个警告吗?如何修复它以使警告消失?
这是 CMake 在您为其提供未使用的命令行选项时生成的标准警告。例如,当 CMakeLists.txt 文件实际上不使用该变量时传递-DFOO=bar
给该变量。cmake
FOO
现在,这是一种特殊情况:CMAKE_TOOLCHAIN_FILE
CMake 第一次配置您的构建时使用它,但是,由于您无法更改已配置构建的工具链,因此每隔一次都会忽略此变量;因此警告。
正如回答者在评论中指出的那样,您可以放心地忽略警告。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 的回答给出了第三种选择(也许是最好的)。这涉及通过在状态消息中输出变量来简单地使用变量。这样,它就不会被使用,因此不会触发警告。您甚至可能会发现该消息对于调试与工具链配置相关的问题很有用。
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 的残余物。
执行 a rm -rf CMakeCache.txt CMakeFiles/
,第一次执行 . 时消息将消失cmake -DCMAKE_TOOLCHAIN_FILE=foo.cmake .
。第二次,他们将再次出现,正如@Guilaume 回答的那样,没关系。
PS:我首先做了一个git clean --force
,但由于这些文件通常在 中.gitignore
,因此不会重置构建。