交叉编译 ARM/Android 的大型C++项目 - 问题和注意事项



在我们的团队中,我们有一个基于OpenCV和VLFeat构建的C++项目,由一位刚刚离开的同事编写。

我被要求为Nexus 4(ARM(交叉编译它,运行它并分析它(gprof(。因此,没有必要通过 Java 包装器和 NDK:不请求任何应用程序。

我在这方面遇到了很大的麻烦,因为我在交叉编译方面完全是新手:我找到使用 NDK 的所有指南和教程的建议。例如,本书很好地解释了如何设置整个系统(使用捆绑了Android SDK,NDK,Eclipse和OpenCV的NVIDIA Tegra开发套件(。

你认为交叉编译这样一个对 arm 有如此多依赖的大型项目是一个可行的选择吗?我还担心,即使在我将设法交叉编译的情况下,代码也不起作用。

如果是,您能否指出一些资源来解释我如何做到这一点(除了 OpenCV 说明,这些说明不是特别有用(?

如果没有,如果有人在论证方面比我更有经验的人能够辩论为什么使用 NDK 要好得多,我将不胜感激。

-------------编辑------------

为了完整起见,我报告了我的进展情况。我设法为ARM交叉编译OpenCV,生成静态库。我还成功地交叉编译了VLFeat。

现在,它发生了我所害怕的事情:make抛出大量未定义的引用。我已经将 &> 输出的头部粘贴到这个粘贴中。

有什么考虑吗?我几乎认真地相信粗略的交叉编译是行不通的,最好从 NDK 重新做整个项目。显然,我希望有人能反驳我。

提前感谢您的帮助,我不知道该转向哪条路。

您可以只使用 NDK

编译器和常规生成文件,而无需使用 NDK 构建脚本。有一些脚本使 NDK 编译器的行为更像是常规的 GCC,https://code.google.com/p/android-cruft/。 该脚本最后一次更新是在 4 年前,因此可能需要进一步改头换面。

您可能面临的最大问题是 C 库中的不兼容或缺少对高级C++功能的支持。 Android有点像弗兰肯斯坦系统,它使用linux作为内核,但BSD喜欢C库。 许多低级实用程序不能很好地针对此类环境进行编译。 此外,许多C++功能依赖于libg++库,它可能与GNU C库有很强的关联。

我看了一下你的糊状物。首先突出的是 libjpeg ,或缺乏。我不知道你的链接步骤是如何不涉及-ljpeg的.您还需要一些与pthread相关的东西。请注意,Android 支持几乎所有pthread API,包括 pthread_mutex_init() ,但没有 libpthread ;相反,所有这些函数都是在 libc 中定义的。也许,其他图书馆也失踪了。

我们正在构建一个大型应用程序,包括OpenCV,boost,libjpeg-turbo...对于所有这些,我们使用CMake来生成使用NDK的生成文件。查看您的链接错误,您的链接命令行中似乎缺少一些库。-LJPEG 可能。对于 pthread,我将看看我们如何在工作中处理它。

相关内容

  • 没有找到相关文章

最新更新