C++ 构建系统 - 使用什么? [关闭]

2024-04-06

我正在考虑用 C++ 启动一个新项目 - 最初是在我自己的时间 - 并且我正在研究可用的构建系统。答案似乎是“很多,而且都很糟糕”。

我为此特别需要的功能是:

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

现在,我知道我可以使用 CMake 和 Autotools 轻松完成其中的 1-4 项工作。可能还有 SCons 和 Waf 以及其他几个。问题是我从来没有弄清楚如何使用它们正确地进行代码生成 - 也就是说,在第一次运行构建过程之前,源文件并不存在,因此构建系统必须能够将源文件转换为可执行代码但实际上直到构建开始才知道...(ASN1C 特别生成了数十个必须能够协同工作的头文件和源文件,并且实际生成的文件集取决于 asn 文件的内容)事实上,这些都不是特别容易维护 - CMake 和 Autotools 有自己的大量脚本,您需要管理这些脚本才能工作,而 Waf 和 Scons 要求任何使用它们的人都具有相当的 Python 知识(我不要)与他们一起工作......

那么 - 对于这样的事情推荐什么构建系统呢?或者我现在会被 make 文件和 shell 脚本困住吗?


+1表示“很多,而且很糟糕。”

但是,“最富有”和“最具规模化”的可能是CMake http://www.cmake.org/,这是一个 Makefile 生成器(还生成本机 MSVC++*.proj/*.sln)。奇怪的语法,但是一旦你学会了它,它可以让你很好地为不同平台生成构建。如果我“重新开始”,我可能会使用CMake。它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外呈现出“自己的生命”,具体取决于您想要做什么。 (见下文。)

对于简单的项目,QMake http://en.wikipedia.org/wiki/Qmake生成器就可以了(您不需要使用 Qt 库来使用 QMake)。但是,您没有描述“简单”——代码生成和“额外阶段”意味着您可能想要CMake或者为您自己的扩展提供丰富的 API,例如Scons (or Waf).

We use Scons http://www.scons.org/在上班。它产生“防弹构建”,但速度非常慢。没有其他系统能像它一样防弹Scons。但是,它很慢。它是用 Python 编写的,我们扩展了“工作空间组织”的接口(我们仅指定模块依赖项),这是Scons设计意图(通过 Python 进行的此类扩展)。方便,但构建速度很慢。您可以获得防弹构建(任何开发人员盒子都可以发布最终版本),但速度很慢。而且,它很慢。不要忘记,如果您使用Scons不过,它很慢。而且,它很慢。

一想到 2000 年过去了十年,我们仍然没有飞行汽车,我就感到不舒服。我们可能还得再等一百年才能得到它们。而且,我们可能都会乘坐我们的飞行汽车四处飞行still是用蹩脚的构建系统构建的。

是的,他们都很糟糕。

[关于代码生成]

Scons作用于“阶段”,并且它们是“有些静态的”。它可以构建作为构建的一部分生成的代码(人们以几种不同的方式执行此操作),但这已被描述为“非常不像 Scons 的东西”。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 构建系统 - 使用什么? [关闭] 的相关文章

  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 编译器错误“错误:在文件范围内可变地修改了‘字符串’”

    考虑 include
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM

随机推荐

  • 选择要显示的随机图像

    我有一个包含 4 张图像的页面 我希望每次查看页面时都从图像选择中随机选择这些图像 图像还需要链接到特定页面 取决于显示的图像 例如 image 01 page 620 html image 04 page 154 html HTML di
  • 动态加载模块的租户特定路由

    我正在使用 ASP NET MVC 开发应用程序框架 本质上 最终目标是能够登录管理界面 创建具有自定义设置的新租户 启用他们想要的模块 博客 购物篮等 工作完成 客户对新网站感到满意 我没有使用单独的应用程序 因为会有很多共享代码 这样维
  • 当文件没有扩展名时,如何告诉 RubyMine 文件类型?

    这看起来应该很容易 我正在创建一个 CLI 命令 gem 所以命令位于bin gem name其中没有 rb扩大 当我尝试在 RubyMine 中编辑该文件时 它没有为其提供语言模式 抱歉 不知道正确的术语 来使语法突出显示和 RubyMi
  • 如何使用现有的 Display 特征实现来实现 Serialize?

    我希望实施Serialize外部板条箱中类型的特征 但这是禁止的 我看了 serde 的远程导出 https serde rs remote derive html 但重写类型似乎需要做很多工作 就我而言 我希望序列化的所有类型都实现了Di
  • JavaScript 中的简单金融利率函数

    我正在寻找一个简单的 javascript 金融 RATE 函数 我找到了这个 但似乎太难理解了 我想简化这个功能 需要你的帮助 如果有人有最简单的功能 请回答 这是一个等效的 Excel RATE 函数 var rate function
  • 使用 .htaccess 阻止对文件和子目录的访问?

    我的目录中有近30个php文件 4个子目录 我想阻止用户直接查看一些 php 文件和子目录 例如http bhavani com hai php 我现在的htaccess file Enable Mod Rewrite this is on
  • Node.js HTTP 请求返回 2 个块(数据体)

    我试图通过 node js 中的 HTTP 请求获取 HTML 文件的源 我的问题是它返回数据两次 这是我的代码 var req http request options function res res setEncoding utf8
  • EUID 和 UID 之间的区别?

    EUID不等于UID 脚本中这两者在什么上下文中使用 我试图通过以下方式获取值echo UID is UID and EUID is EUID 但只有空间作为输出 我的机器运行 Ubuntu 12 04 LTS 在一些网站上看到 这通常用于
  • 在 Android 设备上使用 HTTP Post 将数据放入 Google App Engine Blobstore

    我正在尝试将数据发布到谷歌应用程序引擎上的Blob Store 此代码运行时不会抛出任何异常 但在blobstore端根本没有关于发布请求的日志 当我使用表单 尽管带有 mime 数据 发布时 服务器端的东西就可以工作 我已经允许我的 An
  • Laravel:错误 [PDOException]:无法在 MySQL 中找到驱动程序

    我正在尝试在我的中保存一个寄存器MySQL数据库使用Eloquent of Laravel 5 我编辑了数据库信息 env文件 本地化在我的系统根路径中 并在config database php维持 default gt mysql 和其
  • javascript排序稀疏数组保留索引

    对稀疏数组进行排序并使元素保持相同索引的最佳方法是什么 例如 a 0 3 a 1 2 a 2 6 a 7 4 a 8 5 我想排序后有 a 0 2 a 1 3 a 2 4 a 7 5 a 8 6 这是一种方法 它将定义的数组元素复制到新数组
  • 从 methodInfo.invoke 获取返回值

    我如何获得返回值 int from a methodInfo invoke 让我感到困难的是我使用字符串变量来调用该方法 检查下面的示例 if Convert ToBoolean getParameterFromXML issue k 1
  • 推送通知设备令牌?

    如何从我的 iPhone 设备获取设备令牌 此方法将在调试模式下在控制台中打印 deviceToken 如果您想查看设备令牌 也可以在 UIAlert 中看到 void application UIApplication applicati
  • Response.ContentType application/vnd.ms-excel xls 停止工作

    我对这个问题做了一些相当深入的搜索 但没有运气 在过去的几天里 从 HTML 到 XLS 的输出似乎已停止在我支持的许多旧版 阅读 经典 ASP 系统上运行 我已经能够在多个服务器 从 Office 2010 到 Office 2016 的
  • 将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复]

    这个问题在这里已经有答案了 阅读 SQLAlchemy 文档 http docs sqlalchemy org en latest orm loading relationships html using contains eager to
  • SQL“float”数据类型在作为 XML 输出时会导致不需要的浮点结果

    您可以简单地尝试 table1 有一个类型为 float 的column1 代替 SELECT column1 from Table1 给出如表中所示的值 假设返回 15 1 但是 如果你尝试 Select column1 from Tab
  • GridSearchCV 历史最佳模型 CV

    我正在尝试将 GridSearchCV 与 KerasRegressor 一起使用进行超参数搜索 Keras model fit 函数本身允许使用历史对象查看 loss 和 val loss 变量 使用 GridSearchCV 时是否可以
  • Python:有什么方法可以声明常量参数吗?

    我有一个方法 def foo bar 有没有办法标记bar作为常数 例如 价值在bar不能改变 或 所指向的对象bar不能变 如果 bar 是不可变对象 则 bar 在函数执行期间不会改变 您还可以创建自己的常量对象 食谱在这里 http
  • 设置 元素的背景颜色(高度未设置为 100%)适用于整个视口

    我发现为整个设置背景颜色元素 高度未设置为 100 导致整个视口设置为该颜色 这个html 1 br 2 br 3
  • C++ 构建系统 - 使用什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑用 C 启动一个新项目 最初是在我自己的时间 并且我正在研究可用的构建系统 答案似乎是 很多