CMake在Windows中的默认生成器是什么?

25

在一台电脑上运行 CMake 时,默认情况下 CMake 会生成 NMake 文件。在另一台电脑上,它会生成 Visual Studio 项目。

我知道可以通过在 CMake 命令结尾添加 -G "NMake Makefiles" 来覆盖默认设置,但我想知道为什么它在一台电脑上默认为 Visual Studio 项目,在另一台电脑上默认为 NMake 文件。


这是相同版本的CMake吗? - rubenvb
是的,两台机器上的版本都是2.8.4。 - Chris Finley
我其实已经找到了解决方案,但是还需要等待七个小时才能发布... <.< - Chris Finley
你现在可以发布你的解决方案了@chrisfinley - 已经七年了 :) - user2023370
@user2023370 - 哈!我那天晚些时候确实发布了它...太好了,因为如果我没有这样做,现在我肯定不会记得它;-) - Chris Finley
啊,你这样做了。可惜在2018年,编辑源代码仍然是最好的解决方案 :) - user2023370
2个回答

21

以下内容来自CMake源代码(版本2.8.4:cmake.cxx:起始行2039):

  // Try to find the newest VS installed on the computer and
  // use that as a default if -G is not specified
  std::string vsregBase =
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\";
  struct VSRegistryEntryName
  {
    const char* MSVersion;
    const char* GeneratorName;
  };
  VSRegistryEntryName version[] = {
    {"6.0", "Visual Studio 6"},
    {"7.0", "Visual Studio 7"},
    {"7.1", "Visual Studio 7 .NET 2003"},
    {"8.0", "Visual Studio 8 2005"},
    {"9.0", "Visual Studio 9 2008"},
    {"10.0", "Visual Studio 10"},
    {0, 0}};
  for(int i =0; version[i].MSVersion != 0; i++)
    {
    std::string reg = vsregBase + version[i].MSVersion;
    reg += ";InstallDir]";
    cmSystemTools::ExpandRegistryValues(reg);
    if (!(reg == "/registry"))
      {
      installedCompiler = version[i].GeneratorName;
      }
    }
  cmGlobalGenerator* gen
    = this->CreateGlobalGenerator(installedCompiler.c_str());
  if(!gen)
    {
    gen = new cmGlobalNMakeMakefileGenerator;
    }
  this->SetGlobalGenerator(gen);
  std::cout << "-- Building for: " << gen->GetName() << "\n";

看起来 CMake 会查看 Windows 注册表来确定使用哪个生成器。它在 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\ 中搜索 Visual Studio 的注册表子键(6.0、7.0 等)以查找名为 InstallDir 的条目。如果找到了这个条目,它就会使用相应的生成器。(它会使用可用的最新版本的 Visual Studio。)否则,它会使用 NMake 生成器。

请注意,即使安装了特定版本的 Visual Studio,InstallDir 条目也不总是存在。这可能与安装设置或特定版本的 Visual Studio 有关(例如,似乎 "Express" 版本的 Visual C++ 不会添加此条目)。

当然,您可以通过在 CMake 命令末尾添加 -G {生成器名称} 来覆盖默认设置。


2
Visual Studio 14社区版没有“InstallDir”。我想自动选择64位的“cmake”生成器,但似乎没有简单的方法。 - dashesy
1
实际上它在那里,只需要确保在Windows本身是64位的情况下查看W6432Node,因为VS是一个32位应用程序。 - dashesy
1
此外,对于任何需要的人,这是最新的CMake中的行 - dashesy
1
为此,您应该联系cmake项目,也许有一些环境变量可以选择Win64版本。或者,您可以使用Python版本,并让它选择64位发生器。我希望cmake对此有一些选项。 - dashesy
1
该主题在CMake GitLab问题中被提出此处。不幸的是,该问题已经关闭。 - user2023370
显示剩余5条评论

3

供后人参考。

简而言之:CMake 3.15及以上版本使用环境变量CMAKE_GENERATOR作为默认生成器,如果没有提供-G选项,则cmake将使用它。或者如果使用了无效的生成器,CMake将选择其内部默认生成器。

CMake在3.15版本中引入了一个名为CMAKE_GENERATOR的环境变量来控制默认生成器,详见CMake 3.15 发布说明

有关环境变量CMAKE_GENERATOR的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接