我正在研究 scons ,我只是想确定我知道替代品是什么,之前我将一大块脑细胞投入到完全不同的东西中。我过去一直在使用GNU make,但从未对它特别满意。

特别是:为什么Ant不经常用于C / C ++项目? (鉴于有 ant cpptasks ),我读了一些帖子,说Ant是更多地围绕Java(显然),但这样做的缺点是什么?为什么scons比make好多了?

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

编辑,为什么交叉编译会改变什么?它是一个运行gcc运行方式的编译器,只是它生成的对象文件/可执行文件不能在我的PC上运行。

有帮助吗?

解决方案

对于交叉编译,我认为您最好的选择是 CMake Autotools 。特别是如果您可以为多个体系结构/平台编译代码。我通常在本机上编译我的代码子集以进行单元测试,并为目标平台编译所有代码。 CMake处理这个特别好,因为它允许您指定交叉编译库的位置。因此,不是在/ usr / lib中搜索交叉编译的libpng,而是可以告诉它查看/ opt / arm-eabi-gcc /或者在构建机器上安装了工具链库的任何地方。您可以为不同的变体创建多个构建目录,并使用make手动编译每个变体,或者使用braindead手动滚动递归make触发该批次。

Ant的缺点在于它基本上与vanilla Make一样好或坏,还有一个缺点,就是你使用的东西并不是C或C ++的主流。您必须处理所有自己的依赖项 - 包括内部的依赖项,例如C文件到头文件到库或可执行文件,以及外部依赖项,例如必须与第三方库链接。另外,我不认为Ant C任务确实维护得那么多。我见过的每个人都使用Ant为C提倡用户执行任务来召集GCC。

SCons更好,但交叉编译不是它的优点。它不是<!>“构建系统<!>”;像CMake或Autotools一样,它只是一个构建工具。正如它在他们的维基上所说的那样,它几乎是<!>“在Python中制作<! > QUOT; 。它确实内置了对依赖项的处理,这意味着您不必使用<!>“gcc -MM -MD <!>”来自行处理它们。或者其他什么,所以这比Make更有优势。 SCons还支持检测已安装的第三方库,但通常的方式可以为您的构建时间增加很多。与其他系统不同,SCons每次运行时都会运行检查阶段,但大多数结果都是缓存的。 SCons因其漫长的构建时间而臭名昭着,尽管50个文件不会成为问题。 SCons中的交叉编译支持不存在 - 您必须自己滚动正如邮件列表上的这个帖子所讨论的那样。通常,您强制构建类似于Unix平台,然后覆盖C编译器的名称。构建多个变体或将构建目录从源目录中分离出来的问题很多,如果你跨代并本地编译代码,它就不太适合了。

CMake和Autotools很好地解决了依赖性问题,而autotools的交叉编译支持已经成熟。自2001年4月发布的2.6.0版以来,CMake已经进行了交叉编译。您可以免费获得这些功能,还有其他功能,例如打包和运行单元测试(<!> quot; make check <!> quot;或类似的目标) 。这两种工具的缺点是它们需要自举。对于CMake,您需要安装CMake二进制文件以创建Makefile或Visual Studio解决方案文件。在Autotools的情况下,它稍微复杂一点,因为并非所有编译软件的人都需要安装automake和autoconf,只需要更改构建系统(添加新文件就像更改构建系统一样)。 2阶段bootstrapping(configure.ac - <!> gt; configure,configure + Makefile.in - <!> gt; Makefile)在概念上有点难以理解。

对于编辑:交叉编译在构建系统中是一个额外的难题,因为它增加了复杂性自动检测程序和库。 SCons没有处理这个问题,它由你来解决。 Ant同样没有任何作用。 Autoconf在autotools案例中处理这个问题,但你可能需要提供<!> quot; - with-libfoobar = / some / path <!> quot;当您在链接阶段尝试使用/ usr / lib时配置或面对断开的链接时在命令行上。 CMake的方法与工具链文件相比更加重要,但这意味着您不必指定所有工具和库(CC,CXX,RANLIB, - with-ibfoo =等),因为它们是从标准惯例。理论上,您可以在多个项目中重用适当制作的CMake工具链文件来交叉编译它们。在实践中,CMake的普及程度不足以使普通黑客更方便,但如果您创建多个专有项目可能会有用。

其他提示

几年前我使用Ant + CppTasks来构建通过JNI集成到新Java代码中的非常大的代码库,并且非常满意C ++代码非常可靠的增量构建的结果,良好的灵活性(在构建文件,或通过调整代码)。但是,CppTasks是一个没有社区的项目,维护者(Curt Arnold)很长一段时间没有做任何事情。它仍然非常好用,但要注意很少有人知道或使用CppTasks(编译器<!> quot; bid <!>的方式)文件咬我,例如当我需要一个特定的C文件编译器时,不同的C ++编译器正在挑选它们。)

CppTasks跟踪编译选项的方式,以及动态扫描源依赖关系的方式,总是足够快(存在一些依赖关系的缓存),意味着我使用过的唯一具有准确增量构建的系统,在构建非常大的代码库时非常重要。

因为我已经在Ant用户/开发人员列表上说了几次,如果你有很多Java的东西,并且已经有了对Ant的投资,并不害怕潜入doc CppTasks的代码,现在需要构建JNI <!> quot; glue <!> quot;代码和/或<!> quot; legacy <!> quot;胶水代码暴露的本地库,它是一个有价值的竞争者,奖励可能很棒。

我轻松整合<!> lt; rc <!> gt;为Windows dll添加完整的版本信息,例如,编写一个小的Ant任务来正确格式化.res文件。它对我有用,但Ant + CppTasks肯定更适用于<!> quot; advanced <!>; Ant用户/开发人员恕我直言。

我希望这会有所帮助。 --DD

我想建议 terp 从ANT构建C ++项目。我们开发了terp,因为ANT是我们选择的构建工具,CppTasks在牙齿上有点长,因为我们希望在不同的抽象层次上工作。 terp支持许多不同的编译器,它得到了我们公司的支持。对于大多数项目来说,它并不是免费的。

我们设计的terp主要用于完全重建,而不是使用依赖性分析的增量构建。我们到了那里但它还没有。 terp的最佳位置是多平台,多进程,多编译器版本,您不希望为所有组合维护n种不同的配置。此时(2009年7月),它已进入公开测试阶段,但很快就会发布。

过去五年我一直致力于使用ant进行x86和arm构建的项目。为了我们的目的,我们调整了cpptasks来生成一个通用的编译器,我们只是将前缀传递给...例如arm-gum-linux-gnueabi-然后它会被添加到实际的工具中,比如g ++或者ar等等。没有前缀意味着您获得了开发平台构建工具。交叉编译的工具链在其构建工具二进制文件中具有这些前缀。使用Ant而不是基于任何东西制作的几乎所有理由都是cpptasks能够进行实际构建以及必须发生以保持autoconf快乐的不和谐的东西。我们能够支持这样的范例:几乎任何源文件,特别是库集的文件夹树结构中的源文件,都可以创建/重命名/删除,并且不需要对构建文件进行编辑。一个小缺点是链接文件以一种会导致不必要的重建的方式更新属性。

<target name="lib.cvp">
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/>
    <cc objdir="${obj.dir}/common/cvp" 
        commandPrefix="${command.prefix}" 
        compilerName="${compiler.name}"
        outfile="${lib.dir}/cvp" outtype="static">
        <compiler extends="base.compiler"/>
        <compilerarg 
            value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/>
        <compilerarg 
            value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/>
        <compilerarg if="is.x86" value="-DARCH_X86"/>
        <linker extends="base.linker"/>
        <includepath refid="common.inc"/>
        <fileset dir="${project.home}/common/cvp">
            <include name="*.c"/>
            <include name="*.cpp"/>
        </fileset>
    </cc>
</target>

Ant拥有非常庞大的Java用户群(出于自然原因)。事实上,Ant在更广泛的环境中非常有用,这是大多数非Java开发人员都不知道的事情。因此,如果您使用Ant来构建您的C / C ++ - 如果您使用具有更大用户群(CMake或SCons)的系统,则可以自行编写代码。

就我个人而言,我对CMake非常满意,主要是因为它是唯一可以生成真正的Visual Studio项目的构建系统。 SCons也可以,但它们只对SCons进行外部调用,而CMake则生成使用Visual Studio自己的构建引擎的项目。如果您与习惯Visual Studio的人一起工作,这非常有用。

我不确定我是否会调用CMake支持交叉编译<!> quot; mature <!>“,因为它还很年轻。但是CMake人对此非常认真,所以我会毫不犹豫地尝试一下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top