cmake 练习1 no such file or directory
cmake practice step1 no such file or directory
使用 windows 系统在进行 cmake 官网教程的习题练习时如果出现了以下问题:
-- Building for: NMake Makefiles
CMake Error at CMakeLists.txt:7 (project):
Running
'nmake' '-?'
failed with:
no such file or directory
-- Configuring incomplete, errors occurred!
这里报错虽然是 no such file or directory
但是实际上是没有指定 MinGW Makefiles
导致的,这时候我们使用 MinGW Makefiles
就可以编译成功。
如果出现 gcc.exe - broken 之类的如下情况
-- Check for working C compiler: D:/swInstall/Mingw/bin/gcc.exe
-- Check for working C compiler: D:/swInstall/Mingw/bin/gcc.exe - broken
CMake Error at C:/Program Files/CMake/share/cmake-3.29/Modules/CMakeTestCCompiler.cmake:67 (message):
The C compiler
可以使将以下代码添加到 CmakeList.txt
最上面:
INCLUDE(CMakeForceCompiler)
CMAKE_FORCE_C_COMPILER(gcc GNU)
CMAKE_FORCE_CXX_COMPILER(g++ GNU)
虽然此时会出现以下 warring,但是不要慌。
在当前目录已经成功的生成了 Makefile
文件,这时候使用 cmake --build .
进行编译的话会像下面一样编译失败。
CMake Error: Generator: execution of make failed. Make command was: -f Makefile
但是我们可以手动直接 make
至此已经成功!
为什么在windows下需要指定 MinGW Makefiles
在 cmake 源码 version 2.8.4 中有如下代码
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";
哈哈哈,看到了吧,如果不指定 MinGW Makefiles
的话,就会使用 Microsoft Visual Studio
附带的 nmake
。