对于交叉编译,我认为你最好的选择是
CMake或
Autotools。特别是如果你可以为多个架构/平台编译代码。我通常在本地机器上编译我的代码子集以进行单元测试,并在目标平台上编译全部代码。CMake处理这个问题尤其好,因为它允许您指定交叉编译库的位置。因此,它可以被告知在构建机器上安装的工具链库所在的位置(例如/opt/arm-eabi-gcc/),而不是在/usr/lib中搜索交叉编译的libpng。您可以为不同的变量创建多个构建目录,并使用make手动编译每个变量,或者使用一个简单的递归make触发所有变量。
Ant的缺点是它基本上与vanilla Make一样好或不好,但有一个额外的劣势,即你正在使用一个对于C或C++来说不是特别主流的东西。你必须处理所有自己的依赖关系——包括内部依赖关系,例如C文件到头文件到库或可执行文件,以及外部依赖关系,例如必须链接第三方库。此外,我认为Ant C任务并没有得到很好的维护。我见过所有使用Ant进行C开发的人都倡导使用exec任务调用GCC。
SCons更好,但交叉编译不是它的强项。它不像CMake或Autotools那样是一个“构建系统”,而只是一个构建工具。正如其维基上所说,
它就是用Python实现的Make。然而,它内置了处理依赖关系的功能,这意味着您不必使用“gcc -MM -MD”之类的命令来自己处理依赖关系,因此这比Make更具优势。 SCons还支持检测已安装的第三方库,但通常的做法可能会增加构建时间。与其他系统不同,每次运行SCons时都会运行检查阶段,尽管大多数结果都被缓存。 SCons以长时间的构建时间而闻名,但对于50个文件来说这不是问题。 SCons不支持交叉编译-您必须自己处理,
就像邮件列表中讨论的那样。通常,您需要将构建强制设置为类Unix平台,然后覆盖C编译器的名称。构建多个变体或将构建目录与源目录分开充满了陷阱,这使得它在交叉和本地编译代码时不太适用。
CMake和Autotools已经很好地解决了依赖问题,而且Autotools的交叉编译支持也很成熟。自2008年4月发布2.6.0版本以来,CMake就已经具备了交叉编译功能。你可以免费获得这些功能,还有其他功能,比如打包和运行单元测试("make check"或类似目标)。这两个工具的缺点是它们需要引导。在CMake的情况下,您需要安装CMake二进制文件才能创建Makefiles或Visual Studio解决方案文件。在Autotools的情况下稍微复杂一些,因为不是所有编译软件的人都需要安装automake和autoconf,只有那些需要更改构建系统的人才需要安装它们(添加新文件算作更改构建系统)。2阶段引导(configure.ac-> configure,configure + Makefile.in-> Makefile)在概念上有点棘手,需要理解。
对于编辑:交叉编译是构建系统中的额外麻烦,因为它增加了程序和库的自动检测的复杂性。SCons不处理这个问题,它把这个问题留给你去解决。Ant同样也没有处理。在autotools情况下,Autoconf处理这个问题,但是当你配置时,你可能需要在命令行上提供“-with-libfoobar=/some/path”,否则在链接阶段尝试使用/usr/lib时会出现链接错误。CMake的方法稍微重量级一些,需要使用工具链文件,但这意味着你不必指定所有的工具和库(CC、CXX、RANLIB、--with-ibfoo=等),因为它们是从标准约定中找到的。理论上,你可以在多个项目中重用一个精心制作的CMake工具链文件来进行交叉编译。实际上,CMake并不普及,对于普通黑客来说并不方便,但如果你正在创建多个专有项目,则可能很有用。