首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++构建系统-使用什么?

C++构建系统-使用什么?
EN

Stack Overflow用户
提问于 2012-08-18 17:48:04
回答 8查看 77.1K关注 0票数 145

我正在考虑在C++中开始一个新项目-最初只是在我的业余时间-我正在研究可用的构建系统。答案似乎是“很多,而且它们都很糟糕”。

为此,我特别需要的特性是:

  1. C++11支持
  2. 跨平台(以Linux为主要目标,但至少也能在Windows上构建)针对多个模块的
  3. 得体单元测试
  4. 用于分离代码的多个模块
  5. 支持代码生成(使用asn1c或protobuf -尚不是100%确定)

<代码>H111易于维护<代码>H212<代码>G213

现在,我知道我可以使用CMake和Autotools轻松地完成其中的1-4个。可能还包括SCons和Waf以及其他几家公司。问题是,我从来没有想过如何正确地使用它们进行代码生成--即在构建过程首次运行之前不存在的源文件,因此构建系统必须能够转换为可执行代码,但直到构建开始时才真正知道的源文件……(尤其是ASN1C生成了几十个必须能够协同工作的头文件和源文件,实际生成的文件集取决于你的asn文件的内容)还有一个事实是,这些文件都不是特别容易维护的-- CMake和Autotools有自己的大量脚本,你需要管理它们才能工作,而Waf和Scons要求任何使用它们的人都有不错的python知识(我没有)才能使用它们……

那么,对于这样的事情,推荐使用什么构建系统呢?或者我现在只能使用make文件和shell脚本了?

EN

回答 8

Stack Overflow用户

发布于 2012-08-19 06:21:07

+1代表,“太多了,它们太可怕了。”

但是,“最丰富的”和“最具伸缩性的”可能是CMake,它是一个Makefile生成器(也生成原生的MSVC++ *.proj/*.sln)。奇怪的语法,但是一旦你学会了它,你就可以很好地为不同的平台生成构建。如果我是“started fresh”,我可能会使用CMake。它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外呈现“自己的生命”,这取决于您想要做什么。(请参见下文。)

对于简单的项目,可以使用QMake生成器(使用QMake不需要使用Qt库)。但是,您没有描述“简单”--代码生成和“额外阶段”意味着您可能需要CMake或具有丰富应用编程接口的扩展,如Scons (或Waf)。

我们在工作中使用Scons。它产生了“防弹构建”,但它真的很慢。没有其他系统会像Scons一样防弹。但是,它很慢。它是用Python语言编写的,我们已经为我们的“工作空间组织”(我们只指定模块依赖项)扩展了接口,这是Scons设计意图的一部分(通过Python进行的这种类型的扩展)。很方便,但是构建速度很慢。你得到了无懈可击的构建(任何开发人员盒都可以完成最终版本),但速度很慢。而且,它很慢。但是,不要忘记,如果您使用Scons,它的速度会很慢。而且,它很慢。

想到2000年后的十年,我们仍然没有会飞的汽车,这让我很不舒服。我们可能还要等上一百年才能拿到它们。然后,我们可能都会开着我们的会飞的汽车到处飞来飞去,这些汽车仍然是用糟糕的建造系统建造的。

是的,它们都很糟糕。

关于代码生成

Scons在“阶段”上工作,它们是“有些静态的”。它可以构建作为构建的一部分生成的代码(人们用几种不同的方式来做这件事),但这被描述为“非常不像Scons的东西”。

如果只是简单的“预处理一些文件并生成源文件”,那么就没什么大不了的(您有很多选择,这就是为什么编写qmake --用于*.hpp/*.cpp文件的moc预处理)。

然而,如果你是以一种“繁重的方式”来做这件事,你将需要编写自己的脚本。例如,我们有作为构建的一部分的脚本,它查询数据库并生成C++类来在“层”之间进行接口(在传统的3层应用程序开发中)。类似地,我们通过IDL生成服务器/客户端源代码,并嵌入版本信息,以允许多个客户端/服务器同时运行不同的版本(对于相同的“客户端”或“服务器”)。大量生成的源代码。我们可以“假装”这是“构建系统”,但实际上,它是一个用于“配置管理”的非平凡的基础设施,其中一部分是“构建系统”。例如,此系统必须将“关闭”和“启动”服务器作为此过程的一部分。类似地,回归测试是作为这个过程的一部分执行的,版本之间有大量的“报告”和“差异测试”--所有这些都是我们“构建脚本”的一部分。

票数 128
EN

Stack Overflow用户

发布于 2014-06-18 21:57:54

现在可以使用Gradle了:https://docs.gradle.org/current/userguide/native_software.html

自从我最初发布这篇文章以来,这似乎已经相当成熟了。说这个项目正在“孵化”的页面已经消失了,但我找不到任何官方声明删除这个状态。

票数 34
EN

Stack Overflow用户

发布于 2014-12-16 02:08:48

我找到了这些,我还没有亲自使用过:

Ninja,一个专注于速度的小型构建系统。谷歌现在使用忍者来构建Android,而不是Make:link

Shake,一个强大而快速的构建系统。

Tup,一个高性能的构建系统。基于Algorithmic的设计。Analysis of Tup

所有这些现在都是跨平台的,并且都支持Windows。我还不确定您的其他需求,因为我还没有亲自测试它们。他们正在被用于商业开发,CIG拿起了忍者。我已经使用并喜欢忍者的轻松和快速的项目生成器。前两个类似于Scons、Ant等。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12017580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档