背景簡介
我是一名Java大數(shù)據(jù)工程師,最近公司有個項目要進(jìn)行跨平臺移植。該項目是上年由我和公司的一位資深C++工程師合作完成的(準(zhǔn)確來說,我只負(fù)責(zé)了項目的一些收尾工作。該項目難度挺高的,據(jù)說在我之前已經(jīng)換了好幾班人馬了,項目末階段開發(fā)及最終驗收是由我們兩個負(fù)責(zé))。該項目對一款基于C++和python語言開發(fā)的國際開源軟件進(jìn)行了二次開發(fā)。這個項目之前一直是在x86架構(gòu)上編譯運行的,現(xiàn)在我們要移植到arm平臺上(華為的鯤鵬云主機),所以很多依賴庫需要重新編譯。他前段時間離職了,他那部分現(xiàn)在也由我負(fù)責(zé)了。我就開始惡補C/C++、make、cmake、ccmake和QT等,然后把他寫的源碼在arm平臺上進(jìn)行編譯??缙脚_移植,沒有編譯環(huán)境,一切從零開始,遇到無數(shù)問題,很多問題可能比較低級,大神勿噴,經(jīng)驗總結(jié)如下。
先上張最終編譯成功的圖
千淘萬漉雖辛苦,吹盡狂沙始到金

編譯環(huán)境
工欲善其事,必先利其器

問題1:boost/thread/mutex.hpp: No such file or directory
落花有意隨流水,流水無心戀落花

- 問題分析及解決方法:
這是沒有安裝第三方依賴庫boost哈!
boost是一套開源的、高度可移植的C++模板庫,是比較常用的標(biāo)準(zhǔn)庫備庫(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。
如果已經(jīng)安裝了boost,那就是沒配置到依賴中,可以用find命令找到所缺的依賴,然后復(fù)制到目標(biāo)位置,如圖中所示。
問題4:configure: error: cannot guess build type; you must specify one.
橫看成嶺側(cè)成峰,遠(yuǎn)近高低各不同

- 問題分析及解決方法:
- 很明顯,需要你指定build type
./configure --build=arm-linux- 或者更新configure相應(yīng)的
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
不行就卸載重裝
這個問題困擾我很久,網(wǎng)上的經(jīng)驗試過來了也沒用。最后把原來的boost刪除后重裝了個更高版本的才解決了問題。
問題6:error adding symbols: File in wrong format
山重水復(fù)疑無路,柳暗花明又一村

- 問題分析及解決方法:
圖中的靜態(tài)庫
libreftek.a是在x86上編譯的,而這里是在arm平臺上編譯,所以需在arm平臺上重新編譯