C/C++工程編譯常見錯誤及解決方法

背景簡介

我是一名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.guessconfig.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平臺上重新編譯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章