“是什么意思?”;重新运行cmake no build系统参数“;?

“是什么意思?”;重新运行cmake no build系统参数“;?,cmake,Cmake,我一直在收到消息 Re-run cmake no build system arguments 以及我刚刚建立的CMake构建系统的各种失败。我也在谷歌上搜索了十几个出现错误信息的结果,但没有一个结果能告诉你具体信息的含义。这些案例大多出现在特定项目的网站上,因此特定的项目维护人员只需跳过几个小时的分析,说出消息的原因,项目用户很乐意使用 我还偶然发现了发出本文的CMake源代码行 if (this->CheckBuildSystemArgument.empty()) { if (v

我一直在收到消息

Re-run cmake no build system arguments
以及我刚刚建立的CMake构建系统的各种失败。我也在谷歌上搜索了十几个出现错误信息的结果,但没有一个结果能告诉你具体信息的含义。这些案例大多出现在特定项目的网站上,因此特定的项目维护人员只需跳过几个小时的分析,说出消息的原因,项目用户很乐意使用

我还偶然发现了发出本文的CMake源代码行

if (this->CheckBuildSystemArgument.empty()) {
  if (verbose) {
    cmSystemTools::Stdout("Re-run cmake no build system arguments\n");
  }
  return 1;
}
所以一个参数是空的。这并不能解释任何事情,因为“cmake”的最小有效调用是

cmake .
这不是最好的调用:

cmake ..
假设当前目录为空且父目录中有CMakeLists.txt,则CMake mavens会认为它更好。一直使用CMake的人会认识到,命令行上通常没有“构建系统参数”。如果搜索cmake.org文档,则没有“构建系统”或“构建系统参数”等概念的文档

我试图实现的构建系统有点复杂,在这里可以忠实地总结一下。因此,我想了解这条信息的真正含义,以及如何让它消失的一些想法。事实上,我试图最小化我的构建系统来修复一个不同的问题,但我甚至没有重现这个问题。此外,最小化是在一个外层,它实际上是一个Makefile,包含了使用环境变量控制事物的问题


那么,有人能告诉我“重新运行cmake无构建系统参数”是什么意思吗?

从上下文开始,cmake文档中有大量关于构建系统的信息,因为这是cmake的主要功能。CMake是一个构建系统生成器。从中,总结了CMake在构建系统方面的作用:

buildsystem描述了如何使用构建工具从源代码构建项目的可执行文件和库,以自动化该过程。例如,buildsystem可以是用于命令行生成工具的
Makefile
,也可以是用于集成开发环境(IDE)的项目文件。为了避免维护多个这样的构建系统,一个项目可以使用CMake语言编写的文件抽象地指定其构建系统。从这些文件中,CMake通过称为生成器的后端在本地为每个用户生成首选构建系统

考虑到这一点,CMake试图通过检查构建系统来简化工作。这样,如果我们更新CMake文件,就不必记得重新运行CMake并重新生成生成系统。默认情况下,当从命令行调用
cmake
时,此“构建系统检查”将运行。但是,它也会在构建代码时运行(例如,通过运行
make
),以验证构建系统是最新的

实际上,您可以看到检查构建系统的特殊预定义CMake目标。对于基于Makefile的构建系统,它在Makefile中的外观如下所示:

cmake_check_build_system:
    $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles\Makefile.cmake 0
.PHONY : cmake_check_build_system
未记录的CMake命令行选项--check build system后跟
CMakeFiles/Makefile.CMake
是您正在寻找的“build system参数”

此消息:

Re-run cmake no build system arguments
运行
cmake
时出现,因为cmake仍在内部执行生成系统检查。在这种情况下,没有提供
--check build system
参数,因此CMake总是按预期重新生成。因此,它不是一条错误消息,只是一条详细的日志消息,提供了关于CMake正在做什么的更多信息


无论如何,这种“构建系统检查”应该在所有CMake构建系统中进行。例如,VisualStudio创建了一个具有相同行为的
ZERO\u CHECK
目标。它使用
--check stamp list
命令行选项(也未记录)进行检查,以确保项目/解决方案是最新的


另一个注意事项:通过将变量切换到上的
,可以禁用CMake的自动生成系统检查。只需将其放在顶级CMake文件的底部:

set(CMAKE_SUPPRESS_REGENERATION ON)

当然,当您直接调用
CMake
时,CMake将始终重新生成。但是,当此变量为
ON
时,特殊的重新生成目标将被删除(
cmake\u check\u build\u system
用于生成文件,
ZERO\u check
用于Visual Studio等)。

谢谢。在添加了一个cmake总是默认值的参数:-G“Unix Makefiles”之后,我最终认为这条消息不是诊断消息,然后继续往下说。另外,我非常感谢知道这条消息的来源,因为我不太经常收到它(这可能是第一次)我真的很喜欢这个建造系统。是