使用SCons或CMake代替qmake

12

我需要以下事项的建议:

我有一个QT项目,目前已经设置好了与qmake良好协作的构建系统。但由于项目要求和未来方向的扩展,我需要改变它的构建系统,因为应用程序将需要在构建方式上进行一些更改。

现在,每个源文件都被编译成一个相当大的可执行文件,这是手动打包并发送到下载区域的。这样很好。

但我想采取的方向是以模块化的方式对应用程序进行分解,使得每个“特性”都会被编译成一个共享库,并且用户(开发者)可以选择他想要编译的组件。这些“特性”被放置在源树中的目录中(例如:query_builder、reverse_engineer、mysql_DB_support、version_managemen等目录),当用户构建应用程序时,他只需告诉构建系统编译具有查询构建器和MySQL功能的应用程序,而不需要反向工程,此时构建系统会从指定的目录中添加源文件并创建一个库。

我还有其他要求,例如:

  • Windows构建,Linux构建
  • 可选的打包构建(deb、rpm)
  • 支持QT和可能的QT5
  • 多个可执行文件(GUI客户端、CLI客户端)

经过一些“市场调研”,我最终选择了CMake和SCons作为两个可能使用的系统。我有一些CMake经验和一些Python经验,但还没有使用过SCons。

但我不知道哪一个最适合我的情况,这就是我需要你的帮助的地方。你能详细说明我应该使用哪一个吗?如果您认为我的要求可以通过qmake实现,请也让我知道,

谢谢, f.


1
我推荐使用CMake完成此任务。它非常适用于在Windows上与Qt一起使用(自2008年以来,我基本上在工作和家庭中的每个项目中都使用它),并且支持您所描述的可选组件。虽然话说回来,我不使用scons,无法进行比较。 - drescherjm
1个回答

8
这个问题没有正确答案,通常归结为个人偏好,有点像vi和emacs(当然正确答案是vi :))。
您应该研究每个选项的优缺点,并评估它们如何符合您的要求和需求。
我偏爱SCons,主要是因为我受不了CMake语法,但这是个人偏好。以下是我认为每个选项的优缺点:
CMake 优点: - 与QMake相似,因为它是一个makefile生成器 - CMake被广泛使用,因此有很多参考资料和帮助可用 - 有一个GUI(根据下面Calvin1602的评论,我自己不知道)
缺点: - CMake有自己发明的语法,许多人(包括我在内)认为不直观。 - 两步构建过程,首先创建Makefiles,然后执行编译 - 几乎不可能阅读生成的Makefiles
SCons
优点:
  • 语法是Python,被广泛使用并且相对容易学习。(而且Python很酷:)
  • 构建过程只需一步,执行SCons即可编译。无需生成或维护中间构建文件。
  • 过去,SCons比CMake慢,但现在它更快了,可能与CMake一样快或更快,因为它不必生成makefile。
  • 功能集齐全,支持多种语言,而CMake则专注于C/C++。
  • 非常准确的隐式依赖系统:无需显式列出依赖的头文件、库等。如果需要,可以指定显式依赖项。
  • 提供Eclipse插件。Eclipse还有可用于Python的插件。
  • 已创建工具以处理Qt项目的MOC和其他相关代码生成,如此处所述。

缺点:

  • SCons可能没有CMake那么广泛使用,但仍有大量支持可用。
  • 根据项目的大小,SCons可能会使用大量内存,因为它会解析所有构建脚本并在实际编译之前在内存中构建依赖关系树。然而,这确实允许更准确的依赖检查。

我想补充一下,CMake有一个很棒的图形界面,可以让你选择想要编译的部分。 - Calvin1602
@Calvin1602 我不知道。GUI是CMake的一部分还是额外的应用程序?那个GUI在Windows和Linux上都可以工作吗? - Brady
这是CMake的一部分。在Linux上,运行cmake-gui。在Windows和Mac上,点击图标=)。还有ccmake,它是gui的命令行等效版本。从这里,您可以设置任何类型的任何变量(它们在CMakeLists.txt中声明)。 - Calvin1602
13
对许多人来说(尤其是Windows开发人员),你所说的“两步构建过程中首先创建Makefile,然后实际执行编译”的“缺点”实际上是一个巨大的优点。这是因为CMake可以直接使用本机VS编译器生成Visual Studio解决方案和项目。与SCons不同,后者会生成一个包装器,点击“构建”意味着“运行SCons进行构建”。 - Angew is no longer proud of SO
qmake也完成了最后一部分。 - mlvljr
考虑到微软利用多核的奇怪方式(将多个源文件传递给一个“cl”调用),使用两步构建会更快,即使使用jom和qmake也是如此。 - Lothar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接