【问题标题】:Autotools vs CMake for both Windows and Linux compilation适用于 Windows 和 Linux 编译的 Autotools vs CMake
【发布时间】:2011-08-15 19:36:44
【问题描述】:

我一直在寻找 Autotools 和 CMake 的优缺点。但我想知道那些在项目中使用过这些工具中的一种(或两种)的人的意见。

一年前我基本上使用了 Autotools,我知道其中一个优点是它依赖于 shell 脚本,因此不需要安装即可运行并使用可移植的 shell 脚本。但是好像太面向unix了,在windows上运行configure文件是不可能的。

我现在必须为an open source project 选择一个构建系统工具,它必须至少针对 Linux 和 Windows 进行编译。它是用 C++ 编写的,并使用 Qt GUI 前端,其余部分是“通用的”。

感谢您的帮助。

【问题讨论】:

标签: cmake build-process portability autotools


【解决方案1】:

2019 年 1 月 16 日更新:随着工具的发展提供完善的建议。

我以前用过自动工具很长时间了。

目前我只在需要时大量使用meson 和 cmake。

一些个人建议:

  1. 对于大型团队,如果您想使用 XCode 的生成器,请坚持使用 CMake。如果你不需要它,我会直接使用 Meson。 Meson,从 0.49 版开始,还支持查找 CMake 配置文件(尽管我还没有测试它的效果如何)。此外,Visual Studio 目前似乎得到了足够好的支持,不过,我自己也没有尝试过。 CMake 的优势在于它集成了 Visual Studio。

  2. 放下自动工具。介子已经很好地涵盖了一切。他们的交叉编译模型非常容易理解。在 CMake 中,我上次检查时,一切都变得更加困难。

我也试过sconswaftup

功能最全、跨平台的系统是CMake,但介子的DSL对于习惯python和其他人来说会更容易使用。 Meson 也开始支持 VS(一个 VS2015 生成器),一些项目已经对它提供了实验性支持,例如 gstreamer。 Gstreamer 也可以在 windows 中使用介子编译。现在有 VS2015 生成器和 VS2017,但我最近没有尝试自己的生成器。从介子 0.37.1 开始,需要一些工作,但他们正在改进它们,当前版本已经是 0.40。

介子

优点:

  • DSL 完全没有阻碍。事实上,它非常好用且熟悉,基于 python。
  • 深思熟虑的交叉编译支持。
  • 对象都是强类型的:你不能轻易犯字符串替换错误,因为对象是诸如“依赖”、“包含目录”等实体。
  • 如何为您的某个工具添加模块非常简单。
  • 交叉编译似乎更易于使用。
  • 真的很周到。 Meson 的设计者和主要作者知道什么 他在设计构建系统时说得很好。
  • 非常非常快,尤其是在增量构建中。
  • 文档比您在 cmake 中找到的要好 10 倍。去访问http://mesonbuild.com,你会找到教程、howtos 和一个很好的参考。它并不完美,但确实可以发现。

缺点:

  • 虽然不如 CMake 成熟,但我认为它已经完全可用于 C++。
  • 虽然可用的模块不多,但 gnome、qt 和常用模块已经存在。
  • 项目生成器:目前看来 VS 生成器工作得不是很好。 CMake 项目生成器要成熟得多。
  • 具有 python3 + ninja 依赖项。

Cmake

优点:

  • 为许多不同的 IDE 生成项目。对于团队来说,这是一个非常不错的功能。
  • 与自动工具不同,与 windows 工具配合得很好。
  • 成熟,几乎是事实上的标准。
  • Microsoft 正在为 Visual Studio 进行 CMake 集成。

缺点:

  • 它不遵循任何众所周知的标准或指南。
  • 没有卸载目标。
  • DSL 很奇怪,当你开始做比较之类的,字符串 vs 列表或者转义字符时,你会犯很多错误,我很确定。
  • 交叉编译很烂。

自动工具

优点:

  • 最强大的交叉编译系统,恕我直言。
  • 生成的脚本只需要 make、shell 和编译器(如果需要它来构建)。
  • 命令行非常好用且一致。
  • unix 世界的标准,大量文档。
  • 真正强大的命令行:更改安装目录,卸载, 重命名二进制文件...
  • 如果您以 unix 为目标,使用此工具打包源代码非常方便。

缺点:

  • 它不能很好地与 microsoft 工具配合使用。真正的表演者。
  • 学习曲线...嗯...但实际上我可以说 CMake 也不是那么容易。
  • 在遗留项目中普遍使用递归生成。 Automake supports non-recursive builds,但它不是一种非常广泛使用的方法。

关于学习曲线,有两个非常好的资源可供学习:

第一个来源将使您更快地启动和运行。这本书是一个更深入的讨论。

从 Scons、waf 和 tup 来看,Scons 和 tup 更像是 make。 Waf 更像是 CMake 和自动工具。起初我尝试使用 waf 而不是 cmake 。我认为它在某种意义上是过度设计的,因为它具有完整的 OOP API。脚本看起来一点也不短,工作目录和相关的东西让我很困惑。最后,我发现 autotools 和 CMake 是更好的选择。这 3 个构建系统中我最喜欢的是 tup。

图普

优点

  • 非常正确。
  • 非常快。您应该尝试相信它。
  • 脚本语言依赖于一个非常简单的想法,可以在 10 分钟内理解。

缺点

  • 它没有功能齐全的配置框架。
  • 我找不到像doc 这样的目标的方法,因为 它们生成我不知道的文件,它们必须在生成之前列在输出中,或者至少,这是我现在的结论。这是一个非常烦人的限制,如果是的话,因为我不确定。

总而言之,我现在为新项目考虑的唯一事情是 Cmake 和 Meson。如果有机会,我也会尝试 tup,但它缺少配置框架,这意味着当您需要所有这些东西时,它会使事情变得更加复杂。另一方面,它真的很快。

【讨论】:

  • 非常好的概述;感谢您提供指向 Autotools Mythbuster 的链接。我有一本 Calcote 的电子书,但很高兴看到另一个视角。谢谢
  • 谢谢! Meson 看起来相当不错,唯一我不喜欢的主要是 python 的东西(管理多个安装的版本)。 Meson 有办法构建使用不同构建系统的子项目吗?我看到了一种运行外部命令的方法,它可以工作,但似乎不那么优雅。
  • 我不确定是否可以,但您始终可以集成脚本。实际上,我更喜欢介子而不是 cmake。您在 cmake 中与脚本语言战斗所浪费的时间保存在介子中,您可以使用它来集成它。但我记得包装介子(这是介子的子项目功能)现在支持预编译和源代码。不幸的是,要从源代码构建,您需要一个介子文件。对于小项目来说很容易,对于大项目来说,一直重做这个可能是不可行的。
  • 本书也在网上freesoftwaremagazine.com/books/… 有史以来最好的自动工具教程。
【解决方案2】:

我不会推荐用于 Windows 的 autotools。使用 CMake。

为什么? Windows 没有本机 sh.exe,并且仿真速度很慢。配置错误也很容易。我并不是说这在 CMake 中是不可能的,但 CMake 肯定会抽象得更多,因此您不必担心。 CMake 文档可能有点难以阅读,但是一旦设置好,您就可以使用 CMake 支持的所有工具链了。 CMake 还集成了测试、打包等...

Autotools 在 Windows 上运行缓慢,不能轻松地与 MSVC 一起使用,并且在 Windows(和其他操作系统)上存在难以调试和修复的奇怪怪癖。 libtool 在 Windows 上也很糟糕,即使你认为它应该并且可以,它也经常拒绝构建共享库。工具链重定位问题在 libtool 中也很普遍,它可能会查看用户工具链中的错误文件。 CMake 在这方面要容易得多。它假设目标平台的正常情况并创建通用且良好的构建指令。

此外,CMake 有彩色输出 :) 和不错的进度百分比。

PS:作为用户,我只是对 Windows 上的 CMake 和 autotools 有一些经验。 CMake 可以正常工作,autotools 会在你不看的时候咬掉你的耳朵,而当它由于一些奇怪的错误而失败时会对你微笑......

【讨论】:

  • 不错的结论大声笑 :D 说到 CTest,你认为即使是一个很少测试 (~120) 的小项目也可以使用它是一个好主意吗?与非常容易自制的脚本 shell 相比,我并没有真正看到很多优势(这意味着它只会在基于 unix 的 shell 平台上进行测试)。
  • @Julio:嗯,CTest 保证(我认为)主要是平台兼容性。没有人强迫你使用 Cmake 的任何其他部分。
  • 说得很好,这就是为什么我经常使用短语“一切都在 *nix 上编译”,因为大多数东西都有一个 autoconf 配置脚本,但没有一个 CMakeLists.txt - 然后还有提升......在 Windows 上编译是一个不一致的噩梦 :)
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2020-11-20
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多