当我构建一些第三方代码时,我看到来自 CMake 的以下警告:
CMake Warning: Manually-specified variables were not used by the project: CMAKE_TOOLCHAIN_FILE
是什么导致了这个警告? 我检查了配置文件,但是找不到定义这个变量的地方。
我应该关注这个警告吗? 我如何修复它,使警告消失?
这是 CMake 在给它一个命令行选项时生成的标准警告,它没有使用这个命令行选项。例如,当 CMakeLists.txt 文件实际上没有使用 FOO变量时,将 -DFOO=bar传递给 cmake。
FOO
-DFOO=bar
cmake
现在,这是一个有点特殊的情况: CMake 在第一次配置您的构建时使用 CMAKE_TOOLCHAIN_FILE,但是,由于您不能为已经配置的构建更改工具链,所以每隔一次都会忽略这个变量; 因此会发出警告。
CMAKE_TOOLCHAIN_FILE
作为 答案在评论中注明,你可以安全地忽略这个警告:
我只能通过在已有的构建树上运行 CMake 来实现这一点 变量 * does * get 在新树中的 * first * run 中使用。 它不会在以后使用,因为您不需要将它指定为 CMake 已经记录了一个加载文件的规则 CMakeFiles/CMakeSystem.cmake 并且不支持更改工具链 现有构建树的。 IOW,这是一个合法的警告实例。
我只能通过在已有的构建树上运行 CMake 来实现这一点 变量 * does * get 在新树中的 * first * run 中使用。 它不会在以后使用,因为您不需要将它指定为 CMake 已经记录了一个加载文件的规则 CMakeFiles/CMakeSystem.cmake 并且不支持更改工具链 现有构建树的。
IOW,这是一个合法的警告实例。
如果这个警告真的困扰你,你有几个选择来抑制它:
可以在运行 cmake时传递 --no-warn-unused-cli选项。
--no-warn-unused-cli
不过,这是一个有点生硬的工具,因为它抑制来自命令行中指定的未使用变量的所有警告。这可能隐藏了一些合理的警告。
在第二次调用 CMake 之前,可以删除第一次调用 CMake 时生成的临时文件。正如在 作者: js。中提到的,您需要删除 CMakeCache.txt文件和 CMakeFiles文件夹。例如,通过执行:
CMakeCache.txt
CMakeFiles
rm -rf CMakeCache.txt CMakeFiles/
但是,作为 Javs 注释,这有点毫无意义。除非您实际上正在更改工具链,否则没有理由删除这些生成的文件。虽然它确实消除了警告,但是它仅仅通过强制重新生成文件来消除警告,这样做是为了获得最小的收益而浪费时间。
Roland Sarrazin 的回答提供了第三种选择(也许是最好的选择)。这涉及到通过将变量输出到状态消息中来简单地 使用变量。这样,它就不是未使用的,因此不会触发警告。您甚至可能发现该消息对于调试与工具链配置相关的问题非常有用。
如果您使用 CLion 之后获得此消息,则需要设置 选项,则需要删除所有 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 .。第二次,他们将再次出现在那里,“纪尧姆回答说没关系。”。
cmake -DCMAKE_TOOLCHAIN_FILE=foo.cmake .
附言: 我首先做了一个 git clean --force,但是因为这些文件通常在 .gitignore中,所以 没有重置了构建。
git clean --force
.gitignore
Guillaume 的回答 已经解释了为什么会得到这个特定的未使用变量警告。
避免警告的一个简单而有用的方法是在状态消息中使用该变量(不删除第一次调用 CMake 时生成的临时文件)。例如:
MESSAGE(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}")
通过输出 CMAKE_TOOLCHAIN_FILE的值作为 Roland Sarrazin 建议来规避警告是一个聪明的解决方案。但是,这个警告有可能是合法的,因为在初始配置之后不可能更改工具链。如果只有当用户试图设置一个不同的 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 警告,并将其替换为更有针对性的警告。