在一臺PC上運行CMake時,CMake默認生成NMake文件。另一方面,它生成一個Visual Studio項目。Windows中CMake的默認生成器是什麼?
我知道我可以通過將-G "NMake Makefiles"
添加到我的CMake語句的末尾來覆蓋默認值,但我想知道爲什麼它默認爲一個上的Visual Studio項目和另一個上的NMake文件。
在一臺PC上運行CMake時,CMake默認生成NMake文件。另一方面,它生成一個Visual Studio項目。Windows中CMake的默認生成器是什麼?
我知道我可以通過將-G "NMake Makefiles"
添加到我的CMake語句的末尾來覆蓋默認值,但我想知道爲什麼它默認爲一個上的Visual Studio項目和另一個上的NMake文件。
以下是從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}
來設置。
對於後代:[CMake郵件列表中有一個條目](http://www.mail -archive.com/[email protected]/msg18033.html)解決了這個問題。要更改默認生成器,似乎需要修改CMake源文件並重新編譯或編寫一個小批處理文件,該文件在未指定時添加'-G'選項來替換生成器。 –
Visual Studio 14社區沒有'InstallDir'。我想自動化64位選擇'cmake'生成器,似乎沒有簡單的方法。 – dashesy
實際上它就在那裏,只要確保在Windows本身是64位的情況下查看'W6432Node',因爲VS是一個32位應用程序。 – dashesy
這是CMake的相同版本嗎? – rubenvb
是的,兩臺機器的版本都是2.8.4。 – cfinley
我實際上找到了一個解決方案,但它不允許我再發布它七個小時...... <。< – cfinley