22

1台のPCでCMakeを実行すると、CMakeはデフォルトでNMakeファイルを生成します。もう1つは、VisualStudioプロジェクトを生成します。

CMakeステートメントの最後に追加することでデフォルトをオーバーライドできることは知っていますが、デフォルト-G "NMake Makefiles"で1つのVisual Studioプロジェクトと、別のNMakeファイルにデフォルト設定される理由を知りたいです。

4

2 に答える 2

19

以下は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レジストリを調べて、使用するジェネレータを決定しているようです。Visual Studioレジストリサブキー(6.0、7.0など)で[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\、というエントリを検索しますInstallDir。見つかった場合は、対応するジェネレーターを使用します。(利用可能な最新バージョンのVisual Studioを使用します。)それ以外の場合は、NMakeジェネレーターを使用します。

InstallDirVisual Studioの特定のバージョンがインストールされている場合でも、エントリが常に存在するとは限らないことに注意してください。これは、インストール設定またはVisual Studioの特定のバージョンに関係している可能性があります(たとえば、Visual C ++の「Express」バージョンはこのエントリを追加しないようです)。

-G {Generator Name}もちろん、 CMakeコマンドの最後に追加することで、デフォルト設定を上書きすることができます。

于 2011-06-22T12:17:38.827 に答える
1

後世のために。

TLDR:CMake 3.15以降では、環境変数CMAKE_GENERATORがデフォルトのジェネレーターとして使用されます。オプションが指定されcmakeていない場合に使用され-Gます。または、それが無効なジェネレーターであった場合、CMakeは内部のデフォルトジェネレーターを選択します。

CMAKE_GENERATORCMakeは、バージョン3.15でデフォルトのジェネレーターを制御する環境変数を導入しました。このCMake3.15リリースノートを参照してください。

そして、環境変数CMAKE_GENERATORのドキュメント。

于 2021-12-07T13:56:18.907 に答える