C/C++工程編譯常見錯誤及解決方法
- 背景簡介
- 先上張最終編譯成功的圖
- 編譯環境
- 問題1:boost/thread/mutex.hpp: No such file or directory
- 問題2:error: 'cout' is not a member of 'std'
- 問題3:No rule to make target '***', needed by '***'. Stop
- 問題4:configure: error: cannot guess build type; you must specify one.
- 問題5:undefined reference to 'boost***__gun_cxx***, std::__cxx11***
- 問題6:error adding symbols: File in wrong format
背景簡介
我是一名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平臺上重新編譯