我已经为此努力了很长时间。主要是按照这个教程进行操作。我按照说明构建了所需版本的依赖,主要是boost和caffe(这两者还包含许多其他依赖)。我在一台全新安装的Ubuntu 19.10虚拟机上运行整个项目(专门为这个项目设置)。当我进行到构建ArmNN库的步骤(说明部分“构建环境”,第4步)时,在大约45%的进度上链接libarmnn.so失败,并显示以下错误输出:
/usr/bin/ld: */path/to/boost*/boost_1_64_0/stage/lib/libboost_log.a(attribute_name.o): relocation R_X86_64_PC32 against symbol `_ZTVN5boost16exception_detail19error_info_injectorINS_3log12v2s_mt_posix16limitation_errorEEE' can not be used when making a shared object; recompile with -fPIC/usr/bin/ld: final link failed: bad valuecollect2: error: ld returned 1 exit statusmake[2]: *** [libarmnn.so.19.11] Error 1make[1]: *** [CMakeFiles/armnn.dir/all] Error 2make: *** [all] Error 2
我已经使用cxx和c标志-fPIC构建了整个boost库。我特别检查了相关文件(使用ar -x libboost_log.a readelf --relocs attribute_name.o | egrep 'PLT'
,如这个问题的答案中所建议的)
关于如何处理这个错误或我应该注意什么的任何建议将不胜感激。
Patrick
回答:
经过几次尝试和另一个全新的虚拟机,我终于成功地交叉编译了支持Caffe解析器的ArmNN(从Ubuntu到Android)。如果你想做同样的事情,你需要自己编译很多依赖,并且要确保它们都是兼容版本的。当你(像我三周前那样)只是对这些库略知一二时,这说起来容易做起来难。以下是我用来编译的最重要的来源:
- https://github.com/ARM-software/armnn/blob/master/BuildGuideAndroidNDK.md
- https://github.com/ARM-software/armnn/blob/master/BuildGuideCrossCompilation.md
- https://github.com/BVLC/caffe/wiki/Commonly-encountered-build-issues
我经常忽略的最重要的一点是,当你在编译一个依赖时遇到一些缺失的子依赖时,千万不要走捷径。使用apt安装这些依赖通常是解决缺失库问题的最直接和正确的方法。但后来你会遇到库版本不匹配的问题。