Cross为ARM / Android编译大型C ++项目 - 问题和注意事项

时间:2014-04-09 07:48:15

标签: android opencv android-ndk arm cross-compiling

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

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

我遇到了很大麻烦,因为我是一个完整的跨编译新手:所有的指南和教程我都会找到使用NDK的建议。例如,this非常好地解释如何设置整个系统(使用捆绑Android SDK,NDK,Eclipse和OpenCV的NVIDIA Tegra开发工具包)

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

如果是的话,你能否指点我一些资源来解释我该怎么做(除了OpenCV instructions,这些资源并不是特别有用)?

如果不是,我真的很感激,如果在论证中比我更有经验的人可以辩论使用NDK更好的原因。

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

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

现在,它发生了我害怕的事情:make会抛出一大堆未定义的引用。我粘贴了&>的头部。输出in this pastebin

有任何考虑吗?我几乎非常确信粗略的交叉编译永远不会起作用,最好重新完成从NDK传递的整个项目。显然,我希望有人可以反驳我。

在此先感谢您的帮助,我不知道该转向何方。

3 个答案:

答案 0 :(得分:1)

您可以在不使用NDKs构建脚本的情况下使用NDK编译器和常规makefile。有一个脚本使得NDK编译器在这里更像常规GCC https://code.google.com/p/android-cruft/。该剧本最后更新于4年前,因此可能需要进一步改版。

您可能遇到的最大问题是C库中的不兼容性或缺少对高级C ++功能的支持。 Android有点像弗兰肯斯坦系统,它使用linux作为内核,但BSD就像C库。许多低级实用程序无法很好地编译这种环境。此外,许多C ++特性依赖于libg ++库,这可能与GNU C库有很强的联系。

答案 1 :(得分:1)

我看了你的pastebin。突出的第一件事是libjpeg,或缺乏。-ljpeg。我不知道您的链接步骤如何不涉及pthread。您还需要一些与pthread相关的内容。请注意,Android几乎支持所有pthread_mutex_init() API,包括libpthread,但没有libc;相反,所有这些功能都在{{1}}中定义。也许,其他图书馆也不见了。

答案 2 :(得分:0)

我们正在构建一个大型应用,包括OpenCV,boost,libjpeg-turbo ......为此,我们使用CMake生成使用NDK的Makefile。 查看链接错误,您似乎错过了链接命令行中的某些库。 -ljpeg可能。对于pthread,我将看看我们在工作中如何处理它。