ant+cpptasks 与 scons 与 make

2024-03-08

我正在调查scons http://www.scons.org/我只是想确保在我将大量脑细胞投入到完全不同的事物之前我知道替代方案是什么。我过去一直在使用 GNU make,但从来没有对它感到特别满意。

特别是:为什么 Ant 没有更频繁地用于 C / C++ 项目? (假设有ant cpp任务 http://ant-contrib.sourceforge.net/cpptasks/index.html)我读过一些文章,说 Ant 更面向 Java(显然),但是这样做有什么缺点呢?为什么 scons 比 make 好得多?

我正在使用 TI DSP 的交叉编译器,通常一个项目中有 20-50 个 cpp 文件。构建管理中的困难部分似乎是自动依赖性检查。其他一切只是将文件列表与编译器选项集映射在一起。

edit:为什么交叉编译会改变什么?它是一个编译器,其运行方式与 gcc 的运行方式相同,只是它生成的目标文件/可执行文件无法在我的 PC 上运行。


对于交叉编译,我认为你最好的选择是CMake http://www.cmake.org/ or 自动工具 http://sources.redhat.com/autobook/。特别是如果您可以为多个架构/平台编译代码。我通常在本机上编译代码的子集以进行单元测试,并为目标平台编译所有代码。 CMake 处理这个问题特别好,因为它允许您指定交叉编译库所在的位置。因此,与其在 /usr/lib 中搜索交叉编译的 libpng,不如在 /opt/arm-eabi-gcc/ 或构建计算机上安装了工具链库的任何位置进行查找。您可以为不同的变体创建多个构建目录,并使用 make 手动编译每个变体,或者使用脑残的手动递归 make 来触发批次。

Ant 的缺点是它基本上与普通 Make 一样好或一样坏,还有一个缺点是您使用的东西对于 C 或 C++ 来说并不是特别主流。您必须处理自己的所有依赖项 - 包括内部依赖项,例如 C 文件到头文件到库或可执行文件,以及外部依赖项,例如必须与第 3 方库链接。另外,我认为 Ant C 任务并没有真正维护那么多。我见过的每个使用 Ant for C 的人都提倡使用 exec 任务调用 GCC。

SCons 更好,但交叉编译不是它的强项。它也不是像 CMake 或 Autotools 那样的“构建系统”,它只是一个构建工具。正如他们的维基上所说,这几乎是“用 Python 制作” http://www.scons.org/wiki/FrequentlyAskedQuestions#head-00ce208eece451fe9879c6f8dd1c45b56f4c76d1。不过,它确实内置了对依赖项的处理,这意味着您不必使用“gcc -MM -MD”或其他什么来自行构建依赖项,因此这比 Make 有优势。 SCons 还支持检测已安装的第 3 方库,但通常的完成方式会增加很多构建时间。与其他系统不同,SCons 在每次运行时都会运行检查阶段,尽管大多数结果都会被缓存。 SCons 还因其构建时间长而臭名昭著,尽管对于 50 个文件来说这不是问题。 SCons 中不存在交叉编译支持 - 你必须自己推出正如邮件列表中该主题所讨论的 http://thread.gmane.org/gmane.comp.programming.tools.scons.user/21036。通常,您会强制构建像 Unix 平台一样,然后覆盖 C 编译器的名称。构建多个变体或将构建目录与源目录分开充满了陷阱,这使得它不太适合交叉编译和本机编译代码。

CMake和Autotools很好地解决了依赖问题,并且autotools的交叉编译支持也很成熟。 CMake 自 2008 年 4 月发布的 2.6.0 版起就开始进行交叉编译。您可以免费获得这些功能,以及打包和运行单元测试(“make check”或类似目标)等其他功能。这两种工具的缺点是它们需要引导。对于 CMake,您需要安装 CMake 二进制文件才能创建 Makefile 或 Visual Studio 解决方案文件。对于 Autotools,情况稍微复杂一些,因为并不是每个编译软件的人都需要安装 automake 和 autoconf,只有那些需要更改构建系统的人才需要安装(添加新文件算作更改构建系统)。 2 阶段引导(configure.ac -> configure、configure + Makefile.in -> Makefile)在概念上有点难以理解。

对于编辑:交叉编译在构建系统中是一个额外令人头痛的问题,因为它增加了程序和库的自动检测的复杂性。 SCons 不处理这个问题,它让你自己解决。 Ant同样什么也不做。 Autoconf 在 autotools 情况下处理这个问题,但是当您配置时,您可能必须在命令行上提供“--with-libfoobar=/some/path”,或者在链接阶段尝试使用 /usr/lib 时面临损坏的链接。 CMake 的方法对于工具链文件来说有点重,但这意味着您不必指定所有工具和库(CC、CXX、RANLIB、--with-ibfoo= 等),因为它们是从标准约定。理论上,您可以在多个项目中重复使用适当制作的 CMake 工具链文件来交叉编译它们。在实践中,CMake 的普及程度还不足以让普通黑客感到方便,但如果您要创建多个专有项目,它可能会很有用。

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

ant+cpptasks 与 scons 与 make 的相关文章

  • 当您的 ant 构建过程在版本控制上崩溃时该怎么办

    所以我有一个很好的 Java 项目 使用 Ant 构建到 dist 文件夹 整个项目处于版本控制之下 因此我只需通过 dist 文件夹路径上的 svn导出 即可部署最新版本 但我的构建不断删除 dist 文件夹内的 svn 文件夹及其所有依
  • 即使没有任何更改,Makefile 也始终不是最新的

    我有一个包含两个文件夹的目录 src and binmakefile 位于根目录 即使没有更改 此 makefile 也会持续编译 不是最新的 我在这个 makefile 中遗漏了什么吗 all make a b a src a cpp g
  • 在 Linux 上的 makefile 和 Makefile 之间进行选择

    我想在一个目录中同时使用 Makefile 和 makefile 进行 make 默认情况下 它将执行makefile 我可以选择执行 Makefile 吗 提前致谢 最简单的选择是使用 f make f Makefile From man
  • Ant 复制文件而不覆盖

    Is there any command in ant to copy files from one folder structure to another without checking the last modified date t
  • 通过 ant 构建脚本将命令行参数传递给 Java

    运行以下命令时 ant targetname Dk1 v1 Dk2 v2 我想要将命令行参数传递给java like java whatever Dk1 v1 Dk2 v2 我需要从 Java 代码访问这些参数System getPrope
  • 通过ant编译jdk

    我想编译jdk文件以包含调试信息 我想使用 ant 因为它包含在我的 NetBeans 环境中 所以我做了以下操作 将 src zip 解压到 tmp 目录中 在我的 tmp 目录中创建了一个非常简单的 build xml 文件 一个默认目
  • 如何获取目标名称?

    我们知道Xcode维护着环境变量 TARGET NAME 但是如何在 Objective C 代码中访问这个变量呢 我尝试过什么 我已经添加了 TARGET NAME TARGET NAME 这位于构建设置的预处理器宏部分 但现在我不知道如
  • 在 Makefile 的先决条件列表中使用目标的目录路径

    我编写了一个脚本 它接收两个以 cfg 结尾的文件并输出一个以 cmp 结尾的文件 我想将其包含在我的 Makefile 中 因为一些源代码文件依赖于此 cmp 文件 在我的 Makefile 中 我想这样做 cmp cfg dir def
  • 如何删除构建产品

    是否可以自动删除由生成的构建产品setup py脚本基于设置工具 我刚刚开始一个新的 Python 项目 这是我第一次使用设置工具作为一名开发人员 所以我可能会犯错 当我使用构建项目时python setup py bdist 三个目录 b
  • makefile 中的 $< 和 $@ 是什么意思?

    I have a csv b csv 在我的docs csv目录中 我需要将每个文件转换为 json 文件 我遵循这个question https stackoverflow com questions 2706064 compile al
  • 如何在Ant中添加相当于java -D的系统属性

    我需要设置java Djava library path some path我想在运行 ant 脚本 构建 jar 时执行此操作 我想我必须使用
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • 如何使用蚂蚁?

    我一直试图了解 Ant 的用途 但我仍然不明白 有人可以给我一个使用 Ant 的用例吗 我可以尝试看看 Ant 为何有用以及我可以用它做什么 我在 Eclipse 中进行 Java 开发 并且刚刚开始使用 servlet 和 Google
  • 在 Java 构建过程中更改常量的最佳方法

    我继承了一个在 Tomcat 下运行的 Java 应用程序 servlet 由于历史原因 根据应用程序的部署位置 本质上是品牌问题 代码具有不同的 外观和感觉 选项 有几个常量控制这个品牌过程 它们具有不同的功能 不应压缩为单个常量 即 B
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 如何不在输出中打印 makefile 中的注释

    我有一个像这样的 makefile install somecommand some explanation for next command lastcommand 发生的事情是评论 some explanation for next c
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 什么是“制定目标”?

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry

随机推荐

  • 奇怪的行为:列表理解中的 Lambda [重复]

    这个问题在这里已经有答案了 在Python 2 6中 x for x in lambda m for m in 1 2 3 结果是 3 3 3 我期望输出为 1 2 3 即使使用非列表理解方法 我也会遇到完全相同的问题 即使在我将 m 复制
  • Quercus (Java) 比原生 PHP 更快吗?

    如果是这样 为什么 或者也许更好的问题是 何时 我发现了一些零散的评论 例如这个帖子 https stackoverflow com questions 777356 is quercus a viable replacement for
  • Karma、PhantomJS 和 es6 Promise

    我正在编写一个使用新的 es6 Promise 的 JavaScript 库 我可以在 Firefox 中测试该库 因为 Promise 已定义 但是 当我尝试使用 Karma 和 PhantomJS 测试我的代码时 出现错误Can t f
  • 错误问题:“访问路径 被拒绝。”

    我一直在寻找解决该错误的技巧 google stackoverflow com 等 但一切都不起作用 我需要通过 asp net 应用程序动态创建 aspx 文件 我为尝试修复它所做的事情 1 在文件夹的 属性 gt 安全性 中 我添加了
  • HTML5 视频自动播放,但有 5 秒延迟

    我的网页上有一个 20 秒长的 HTML5 视频循环作为背景 并将其设置为自动启动 视频自动播放可以延迟5秒吗 我试图在尝试播放之前让视频完全加载 以防止视频卡顿 这是我当前的代码
  • 对象方法调用不带括号

    导入后是否可以调用不带括号的对象方法 这是我的测试代码 基于本文 http www artima com scalazine articles package objects html马丁 奥德斯基 package gardening fr
  • 实体框架:获取不直接相关的对象

    我正在为我的 NET 应用程序使用实体框架 我也能够返回对象及其直接相关的对象 非常方便 但我在获取这些对象的对象时遇到问题 IEnumerable
  • 在 wpf 中运行视频

    我希望我的第一个项目以视频的形式实现 我该怎么做 我想播放视频 然后当我单击表单时 视频停止并且应用程序转到另一个页面 请帮我 尝试使用 MediaElement
  • Windows 8 - 自定义动态磁贴

    我们正在使用 C 开发适用于 Windows 8 的应用程序 我们的应用程序涉及用户创建的绘图 我们希望将他们的绘图合并到活动磁贴中 我找到了将文本和图片设置为应用程序的动态磁贴的示例 有没有办法做自定义的事情来渲染线条等 或者是通过将 P
  • Formvalidation.io - 无法读取 null 的属性“classList”

    使用 formvalidation io 时 我的控制台总是出现错误 我不知道这个错误的原因是什么 即使我使用后端验证 URL 我仍然会在某些网站上收到垃圾邮件 我正在使用隐形 ReCaptcha https formvalidation
  • 元素结束标记中的属性?

    执行以下操作是否被视为有效 li stuff li li stuff li li stuff 或者做属性have出现在开始标签中 不 不是 您必须在开始标记中使用属性 Running a test in w3c 验证器 http valid
  • 将 springboot 升级到 2.4.4 后,response.sendError(statusCode, "error message") 不起作用

    我在用AuthenticationEntryPoint处理身份验证问题 将异常原因传递给最终用户 response sendError responseCode errorReason 我最近将 Spring Boot 从 2 2 11 R
  • 类似 Javascript ||在 PHP 中 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 In javascript 我可以使用 例如这样的语句 window foo window foo 如果没有的话window foo它将被分配给
  • C++方法声明问题

    我在 Image cpp 中有一些代码 Image Image int width int height int depth m sFileName 0 and in Image h class Image public DrawAble
  • 调试使用 pm2 运行的应用程序

    应用程序由以下人员运行 pm2 start app js or pm2 start config json 我想使用 node inspector 在本地调试我的应用程序 我添加了debug争论 pm2 start node args de
  • UIBarButtonItem 图像应该有多大?

    我正在创建自己的自定义 按日期排序 和 按数字排序 按钮 我计划将它们作为右侧按钮放置在导航栏中 我的图像应该有多大才能适当地填充空间 UIBarItem https developer apple com documentation ui
  • 如何使用 php 在 XML 文件中进行搜索?

    不知道有没有办法在xml文件中搜索 例如 我想要得到Value使用Name from AttrList和产品代码 是否可以 这就是我的 xml 的样子
  • jQuery 将类添加到图像链接,而不会在链接传递变量时弄乱

    好的 所以我使用了一些 jquery 来选择所有 a 页面上的标签以及它们是否链接到图像文件以添加zoom出于灯箱的目的对其进行类处理 这是有效的代码 document ready function a href png a href gi
  • List<>.IndexOf 是按引用还是按值进行比较?

    List
  • ant+cpptasks 与 scons 与 make

    我正在调查scons http www scons org 我只是想确保在我将大量脑细胞投入到完全不同的事物之前我知道替代方案是什么 我过去一直在使用 GNU make 但从来没有对它感到特别满意 特别是 为什么 Ant 没有更频繁地用于