2011-06-21 72 views
15

在一臺PC上運行CMake時,CMake默認生成NMake文件。另一方面,它生成一個Visual Studio項目。Windows中CMake的默認生成器是什麼?

我知道我可以通過將-G "NMake Makefiles"添加到我的CMake語句的末尾來覆蓋默認值,但我想知道爲什麼它默認爲一個上的Visual Studio項目和另一個上的NMake文件。

+0

這是CMake的相同版本嗎? – rubenvb

+0

是的,兩臺機器的版本都是2.8.4。 – cfinley

+0

我實際上找到了一個解決方案,但它不允許我再發布它七個小時...... <。< – cfinley

回答

16

以下是從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有關(例如,似乎Visual C++的「Express」版本不添加此條目。)

當然,可以覆蓋默認值通過在您的CMake命令的末尾添加-G {Generator Name}來設置。

+0

對於後代:[CMake郵件列表中有一個條目](http://www.mail -archive.com/[email protected]/msg18033.html)解決了這個問題。要更改默認生成器,似乎需要修改CMake源文件並重新編譯或編寫一個小批處理文件,該文件在未指定時添加'-G'選項來替換生成器。 –

+1

Visual Studio 14社區沒有'InstallDir'。我想自動化64位選擇'cmake'生成器,似乎沒有簡單的方法。 – dashesy

+1

實際上它就在那裏,只要確保在Windows本身是64位的情況下查看'W6432Node',因爲VS是一個32位應用程序。 – dashesy