CMake如何工作?

我不是问自己。 我希望这个问题能成为许多像我一样喜欢我的新手的参考,对于这样一个小小的CMakeLists.txt文件,发现它背后到底是怎么回事

 cmake_minimum_required (VERSION 2.6) project(Tutorial) add_executable(Tutorial tutorial.cpp) 

和这样一个小的tutorial.cpp

 int main() { return 0; } 

有这么多的文件生成

 CMakeCache.txt cmake_install.cmake Makefile CMakeLists.txt tutorial.cpp 

和一个包含如此多文件和文件夹的CMakeFiles文件夹

 CMakeCCompiler.cmake CMakeOutput.log Makefile.cmake cmake.check_cache CMakeSystem.cmake progress.marks CMakeCXXCompiler.cmake CMakeTmp TargetDirectories.txt CMakeDetermineCompilerABI_C.bin CompilerIdC Tutorial.dir CMakeDetermineCompilerABI_CXX.bin CompilerIdCXX CMakeDirectoryInformation.cmake Makefile2 

不了解幕后发生的事情(即:为什么可能生成文件以及目的是什么)是能够学习CMake的最大障碍。

如果有人知道,为了后人的缘故,请你解释一下吗? 这些文件的目的是什么,当我键入cmake . 在构build项目之前,cmake究竟是如何configuration和生成的?

秘密是你不必了解生成的文件是做什么的。

CMake在构build系统中引入了很多复杂的function,其中大部分只有在您使用它来构build复杂的软件项目时才会有所收益。

好消息是,CMake能够很好地保持这种混乱:使用源代码构build ,甚至不必查看生成的文件。 如果你没有做到这一点(我想是这样,因为你写了cmake . ), 请检查出来,然后再继续 。 把build和source目录混合起来对于CMake来说真的很痛苦,而不是系统应该如何使用。

简而言之:而不是

 cd <source_dir> cmake . 

总是使用

 cd <build_dir_different_from_source_dir> cmake <source_dir> 

代替。 我通常在我的源代码目录中使用一个空的子文件夹build

为了减轻你的痛苦,让我简单介绍一下CMake生成的相关文件:

  • 项目文件/ Makefile – 您真正感兴趣的是:在选定的生成器下生成项目所需的文件。 这可以是从Unix Makefile到Visual Studio解决scheme的任何内容。
  • CMakeCache.txt – 这是一个持久性键/值string存储,用于在运行之间caching值。 存储在这里的值可以是库依赖的path,也可以是可选组件。 variables列表与运行ccmakecmake-gui时所看到的大致相同。 这可能是有用的,不时看看,但我会build议使用上述工具,如果可能的话改变任何值。
  • 生成的文件 – 这可以是从自动生成的源文件到导出macros的任何内容,帮助您将构build的项目与其他CMake项目重新集成。 其中大部分只是按需生成,不会出现在一个简单的项目中,例如您的问题。
  • 其他任何事情都是噪音,以保持构build系统的快乐。 特别是,我从来不需要关心CMakeFiles子目录中发生的任何事情。

一般来说,你不应该混淆CMake为你生成的任何文件。 所有问题都可以通过CMakeLists.txt以某种方式解决。 只要结果按预期构build您的项目,您可能没有问题。 不要太担心血淋淋的细节,因为这是CMake首先想要摆脱的东西。

正如其网站所述:

Cmake是跨平台的开源构build系统,用于使用独立于编译器的方法来pipe理软件的构build过程

在大多数情况下,它被用来生成项目/生成文件 – 在你的例子中,它生成了用于构build你的软件的Makefile (主要在Linux / Unix平台上)。

Cmake允许提供跨平台的构build文件,为特定的编译器/平台生成平台特定的项目/构build文件。

例如,您可以尝试在Windows上使用Visual Studio编译软件,然后在CMakeLists.txt文件中使用正确的语法启动

 cmake . 

在Windows平台的项目目录中,Cmake将生成所有必要的项目/解决scheme文件( .sln等)。

如果你想在Linux / Unix平台上构build你的软件,你可以直接进入你拥有CMakeLists.txt文件的源代码目录,并触发相同的cmake . 它会生成所有必要的文件,通过sipmle makemake all来构build软件。

在这里你可以得到关于Cmake关键function的很好的介绍stuff/learning_cmake.pdf

编辑

如果你想使平台相关的库包含/variables定义等,您可以在CMakeLists.txt文件中使用此语法

 IF(WIN32) ...do something... ELSE(WIN32) ...do something else... ENDIF(WIN32) 

还有很多命令可以用来防止构build失败,Cmake会通知您,例如,您的系统上没有安装boost库filesystemregex 。 要做到这一点,你可以使用下面的语法:

 find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

检查了它将生成适当的系统/ IDE /编译器的makefile。