【问题标题】:What is the default generator for CMake in Windows?Windows 中 CMake 的默认生成器是什么?
【发布时间】:2011-09-19 18:58:08
【问题描述】:

在一台 PC 上运行 CMake 时,CMake 默认会生成 NMake 文件。另一方面,它会生成一个 Visual Studio 项目。

我知道我可以通过在我的 CMake 语句末尾添加 -G "NMake Makefiles" 来覆盖默认值,但我想知道为什么它默认为一个上的 Visual Studio 项目和另一个上的 NMake 文件。

【问题讨论】:

  • 是同一个版本的CMake吗?
  • 是的,两台机器上的版本都是2.8.4。
  • 我确实找到了一个解决方案,但它不允许我再发布七个小时...... <.>
  • 您现在可以发布您的解决方案 @chrisfinley - 现在已经七年了 :)
  • @user2023370 - 哈!那天晚些时候我确实发布了它......也是一件好事,因为如果我没有,我现在不可能记得它;-)

标签: c visual-studio cmake generator nmake


【解决方案1】:

以下来自CMake Source(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 生成器。

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

当然,可以通过在 CMake 命令末尾附加 -G {Generator Name} 来覆盖默认设置。

【讨论】:

  • Visual Studio 14 社区没有InstallDir。我想自动化cmake生成器的64位选择,似乎没有简单的方法。
  • 其实是有的,如果 Windows 本身是 64 位的,请确保查看 W6432Node 内部,因为 VS 是 32 位应用程序。
  • 另外,this 是最新的 cmake 中的行,供任何人查看。
  • 为此你应该联系cmake项目,也许有一些环境变量会选择Win64版本。或者,您可以使用 python 版本并让它选择 64 位生成器。我希望 cmake 对此有一些选择。
  • 该主题是在 CMake GitLab 问题 here 中提出的。唉,问题已经解决了。
【解决方案2】:

为了后代。

TLDR:CMake 3.15 及更高版本使用环境变量CMAKE_GENERATOR 作为默认生成器,如果没有提供-G 选项,cmake 将使用它。或者如果它是一个无效的生成器,CMake 将选择它的内部默认生成器。

CMake 在 3.15 版本中引入了一个环境变量 CMAKE_GENERATOR 控制默认生成器,请参阅此 CMake 3.15 Release Notes

以及环境变量CMAKE_GENERATOR的文档。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 2011-10-23
    • 1970-01-01
    • 2019-09-06
    • 2015-01-21
    • 2012-03-17
    • 2014-05-26
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多