对于交叉编译,我认为您的最佳选择是CMake或Autotools。特别是如果您可以为多个架构/平台编译代码。我通常在本机机器上编译我的代码子集以进行单元测试,并将所有代码都用于目标平台。CMake 处理得特别好,因为它允许您指定交叉编译库的位置。因此,与其在 /usr/lib 中搜索交叉编译的 libpng,不如在 /opt/arm-eabi-gcc/ 或构建机器上安装了工具链库的任何地方进行查找。您可以为不同的变体创建多个构建目录,并使用 make 手动编译每个变体,或者使用脑残的手动递归 make 触发批次。
Ant 的缺点是它基本上与 vanilla Make 一样好或一样坏,另外一个缺点是您使用的东西对于 C 或 C++ 来说不是特别主流。您必须处理所有自己的依赖项——包括内部依赖项,例如 C 文件到头文件到库或可执行文件,以及外部依赖项,例如必须与 3rd 方库链接。另外,我认为 Ant C 任务并没有真正维护那么多。我见过的每个使用 Ant for C 的人都提倡使用 exec 任务来调用 GCC。
SCons 更好,但交叉编译不是它的强项。它也不是像 CMake 或 Autotools 这样的“构建系统”,它只是一个构建工具。正如他们的 wiki 上所说,它几乎是“使用 Python 制作”。不过,它确实内置了对依赖项的处理,这意味着您不必使用“gcc -MM -MD”或其他任何东西在那里滚动自己的,所以这比 Make 更有优势。SCons 还支持检测已安装的 3rd 方库,但通常执行的方式会大大增加您的构建时间。与其他系统不同,SCons 每次运行时都会运行检查阶段,尽管大多数结果都会被缓存。SCons 也因其较长的构建时间而臭名昭著,尽管对于 50 个文件来说这不是问题。正如邮件列表上的这个线程所讨论的那样。通常,您强制构建类似于 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,
对于编辑:交叉编译在构建系统中是一个额外的麻烦,因为它增加了程序和库的自动检测的复杂性。SCons 不处理这个问题,它留给你来解决。Ant 同样什么也不做。Autoconf 在 autotools 的情况下会处理这个问题,但是当您在链接阶段尝试使用 /usr/lib 时,您可能必须在配置时在命令行上提供“--with-libfoobar=/some/path”,否则会遇到断开的链接. CMake 的方法是使用工具链文件更重一些,但这意味着您不必指定所有工具和库(CC、CXX、RANLIB、--with-ibfoo= 等),因为它们是从一个标准的约定。理论上,您可以在多个项目中重用适当制作的 CMake 工具链文件来交叉编译它们。