选择make、cmake之流来控制程序编译是因为:1、为了跨平台;2、构建工具的生态;3、速度;4、需要很多控制。为了跨平台指假如使用 IDE,就需要分别为每个 IDE 重复配置。使用 cmake 工具,只需要写好配置一次,开发的时候根据开发人员的习惯来选择开发方式。
1、为了跨平台
不同的平台有不同的 IDE,比如同一个 C++ 工程,在 Windows 常用的 IDE 是 Visual Studio, Mac 平台的 IDE 是 Xcode。假如使用 IDE,就需要分别为每个 IDE 重复配置。使用 cmake 工具,只需要写好配置一次,开发的时候根据开发人员的习惯来选择开发方式。有些人在 Linux 平台选择 Vim 来开发;有些人习惯用 ,就生成 IDE 项目文件。Mac 平台开发人员就可以用 Xcode,Windows 平台开发人员可以使用 Visual Studio。发布时候,不用发布 IDE 的项目文件。每个平台都用相应的 cmake 来构建。
2、构建工具的生态
生态上说,以前 automake 是在一定程度上优于 cmake 的,但是还是要看谁站在后面。cmake 背后是有一个公司的,而且 KDE 后来选择使用 cmake,对于 cmake 的贡献是很大的。cmake 3 之后它的文件的范式其实也有所变化。automake 以前凭借着 pkg-config 的良好支持更胜一筹。但是现在越来越多的库意识到的一个问题就是,使用它并不是代表只是 link 它就完事了,而是经常需要调用一些这个库配套的 binary 来执行一些任务。这里就需要提供除了仅仅是找库之外的一些 macro/script 来供开发者使用。例如 KDE / Qt 就需要使用 moc,qdbus2cppxml 之类的 binary。CMake 社区提供 find_package 使用的 file 的趋势也是使用新的范式,不是直接手写 include_directories , library_directories target_link_libraries 的路径,而是通过包装好的 target 把外部库也抽象为一个 target 并且把路径依附于这个 target 上。对于大项目来说,有些项目需要使用 third_party 静态链接或者动态链接,这样管理起来的话,静态链接动态链接都可以统一管理。相比 python,C/C++ 社区是更青睐于 cmake 的,其他许多有跨平台需求的重量级项目 boost,llvm 都是使用 cmake 进行构建。毕竟 python 并不原生提供构建系统,你在构建前要先装 python,再装一个 scons 什么的。而对于 autotools, cmake 来说你只需要 cmake,还是节省了工作量的。
3、速度
速度对于小项目来说可能不重要,但是对于大项目来说真的非常重要。对于 automake 的一个批评就是它太慢,configure 一圈下来因为历史因素检查了许许多多奇怪的地方。m4 宏也慢。这是许多项目从 automake 转向 cmake 的一个理由。而对于很多语言来说,速度实在是比不上。
4、需要很多控制
让同一份代码,根据不同的情况、不同的平台、编译出不同的版本。比如可以选择编译成静态库和动态库,是否需要 WebKit 功能,是否需要界面,是否需要支持特定的硬件等等。这些控制,使用 IDE 也很难做得。
延伸阅读:
什么是cmake?
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。
文章标题:为什么会选择make,cmake之流来控制程序编译,发布者:小编,转载请注明出处:https://worktile.com/kb/p/35942