背景简介
我是一名Java大数据工程师,最近公司有个项目要进行跨平台移植。该项目是上年由我和公司的一位资深C++工程师合作完成的(准确来说,我只负责了项目的一些收尾工作。该项目难度挺高的,据说在我之前已经换了好几班人马了,项目末阶段开发及最终验收是由我们两个负责)。该项目对一款基于C++和python语言开发的国际开源软件进行了二次开发。这个项目之前一直是在x86架构上编译运行的,现在我们要移植到arm平台上(华为的鲲鹏云主机),所以很多依赖库需要重新编译。他前段时间离职了,他那部分现在也由我负责了。我就开始恶补C/C++、make、cmake、ccmake和QT等,然后把他写的源码在arm平台上进行编译。跨平台移植,没有编译环境,一切从零开始,遇到无数问题,很多问题可能比较低级,大神勿喷,经验总结如下。
先上张最终编译成功的图
千淘万漉虽辛苦,吹尽狂沙始到金
编译环境
工欲善其事,必先利其器
问题1:boost/thread/mutex.hpp: No such file or directory
落花有意随流水,流水无心恋落花
- 问题分析及解决方法:
这是没有安装第三方依赖库boost哈!
boost是一套开源的、高度可移植的C++模板库,是比较常用的标准库备库(Additions to the Standard C++ Library)。
boost安装可参考https://www.cnblogs.com/dj0325/p/7977692.html
问题2:error: 'cout' is not a member of 'std'
世间无限丹青手,一片伤心画不成
- 问题分析及解决方法:
在报错文件中加入
#include <iostream>
问题3:No rule to make target '', needed by ''. Stop
问渠哪得清如许,为有源头活水来
- 问题分析及解决方法:
编译依赖boost,但依赖库中没有。
首先,检查是否安装了boost。
如果已经安装了boost,那就是没配置到依赖中,可以用find
命令找到所缺的依赖,然后复制到目标位置,如图中所示。
问题4:configure: error: cannot guess build type; you must specify one.
横看成岭侧成峰,远近高低各不同
- 问题分析及解决方法:
- 很明显,需要你指定build type
./configure --build=arm-linux- 或者更新configure相应的
config.guess
和config.sub
wget -O ./config.sub "git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD"
wget -O ./config.guess "git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD"
问题5:undefined reference to 'boost__gun_cxx, std::__cxx11***
不是一番梅彻骨,怎得梅花扑鼻香
- 问题分析及解决方法:
此类问题一般是boost的安装问题
首先查看是否安装了多个版本的boost
不行就卸载重装
这个问题困扰我很久,网上的经验试过来了也没用。最后把原来的boost删除后重装了个更高版本的才解决了问题。
问题6:error adding symbols: File in wrong format
山重水复疑无路,柳暗花明又一村
- 问题分析及解决方法:
图中的静态库
libreftek.a
是在x86上编译的,而这里是在arm平台上编译,所以需在arm平台上重新编译