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列表与运行
ccmake
或cmake-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 make
或make 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库filesystem
和regex
。 要做到这一点,你可以使用下面的语法:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
检查了它将生成适当的系统/ IDE /编译器的makefile。