Linux驅動開發筆記(二):ubuntu系統從源碼編譯安裝gcc7.3.0編譯器

前言

  編譯ubuntu驅動之前,發現使用的gcc是7.3.0,而使用apt管理和下載的都無法直接或間接安裝gcc7.3.0,於是只能從源碼安裝gcc7.3.0編譯器。

 

GCC

概述

  GCC是以GPL許可證所發行的自由軟件,也是GNU計劃的關鍵部分。GCC的初衷是爲GNU操作系統專門編寫一款編譯器,現已被大多數類Unix操作系統(如Linux、BSD、MacOS X等)採納爲標準的編譯器,甚至在微軟的Windows上也可以使用GCC。GCC支持多種計算機體系結構芯片,如x86、ARM、MIPS等,並已被移植到其他多種硬件平臺。
  GCC原名爲GNU C語言編譯器(GNU C Compiler),只能處理C語言。但其很快擴展,變得可處理C++,後來又擴展爲能夠支持更多編程語言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各類處理器架構上的彙編語言等,所以改名GNU編譯器套件(GNU Compiler Collection) 。

下載gcc7.3.0源碼

 

GCC編譯

步驟一:安裝所需要的環境

  這裏肯定要上網了,要是沒有上網則只能自己去下載源碼包,然後配置、編譯和安裝三部曲了,而且還得注意版本號,所以最好還是先安裝一次查看版本號,再去下載對應版本號的源碼,去目標機離線安裝。
  下面是configure配置gcc會出現的問題,所以需要先安裝依賴庫。
  在這裏插入圖片描述

sudo apt-get install libgmp-dev
sudo apt-get install libmpfr-dev
sudo apt-get install libmpc-dev

  在這裏插入圖片描述
  這裏安裝完,然後裝的gcc7.5, 不要卸載已有的gcc,查看“入坑一”。

步驟二:下載解壓

tar xvf gcc-7.3.0.tar.gz

  在這裏插入圖片描述

步驟三:配置configure

./configure

  這裏要增加c和c++的配置,不然編譯出來只有g++了

./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

  查看 “入坑二”。
  在這裏插入圖片描述

步驟四:編譯make

make -j4

  在這裏插入圖片描述
  第一次編譯後再下執行幾次make -j4,最後再執行一次make,確認每個線程都正常跑完(PS:有些錯了就停止了,但是被沒停止的線程沖掉了,保持這個習慣即可避免疏忽)。
  編譯出錯。

步驟五:編譯出錯“fatal error: asm/errno.h: No such file or directory”

  在這裏插入圖片描述
  引入error.h的頭文件,這裏查了很多asm文件夾,最後發現只有asm-generic下的纔有error.h

sudo find / -name asm

  以下的一些都沒有error.h:
  在這裏插入圖片描述
  只有asm-generic下的纔有error.h

sudo ln -s /usr/include/asm-generic /usr/include/asm

  在這裏插入圖片描述

  然後繼續編譯,make -j8
  編譯出錯。

步驟六:編譯出錯“sanitizer_syscall_generic.inc:15:24: error: ‘__NR_open’ was not declared in this scope”

  在這裏插入圖片描述
  這裏錯誤實際上是前面帶進來的

sudo ln -s /usr/include/asm-generic /usr/include/asm

  是錯誤的,需要更改爲另外一個,這裏要先刪除,否則ln新建不了:

sudo rm /usr/include/asm
sudo ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm
ls /usr/include/asm
ls -l /usr/include/asm

  在這裏插入圖片描述
  然後繼續編譯,make -j8

步驟七:編譯成功

  在這裏插入圖片描述

步驟八:安裝

sudo make install

  在這裏插入圖片描述
  在這裏插入圖片描述

步驟九:查看版本號確認

  在這裏插入圖片描述

 

入坑

入坑一:本地需要g++,否則編譯報錯

問題

  卸載了g++,編譯gcc的時候報錯:
  在這裏插入圖片描述

原理

  可能跟交叉編譯一樣,交叉編譯的編譯器也是需要一個編譯器編譯交叉編譯器的源碼來生成交叉編譯器的(只不過最近幾年sdk已經自帶了交叉編譯器了)

解決

  安裝gcc,再次編譯即可。

入坑二:安裝後只有g++,沒有gcc

問題

  gcc版本是7.5,g++版本是7.3。

原理

  配置文件需要配置編譯c和c++的,默認只有c++的。

解決

  修改配置文件

./configure

  這裏要增加c和c++的配置,不然編譯出來只有g++

./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

  然後重新編譯走一遍流程解決。
  在這裏插入圖片描述

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