1. 程式人生 > >centos7 編譯安裝gcc-5.4.0

centos7 編譯安裝gcc-5.4.0

一、安裝開發必備環境:

yum groupinstall "Development Tools"
yum install glibc-static libstdc++-static

二、編譯安裝gcc-5.4.0

你可以到官網下載gcc,也可以直接在這裡下載:http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/ 下載好後進行編譯安裝:

tar -xvf gcc-5.4.0.tar.bz2
cd gcc-5.4.0
./contrib/download_prerequisits
mkdir build
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib make(建議不要使用make -j來編譯,雖然可以縮短編譯時間,但極大可能會編譯失敗) make install

其中執行./contrib/download_prerequisits將自動下載以下幾個檔案,這個幾個檔案在gcc編譯時需要:

  • mpfr-2.4.2.tar.bz2
  • gmp-4.3.2.tar.bz2
  • mpc-0.8.1.tar.gz
  • isl-0.15.tar.bz2

由於網路條件不是很好,在下載這幾個檔案時很久都下載不下來,所以我中斷了很多次,並刪除下載了的檔案,重新執行./contrib/download_prerequisits命令,下載完成後在configure時配置一些選項,我沒有使用--prefix,在make install時將自動安裝到/usr/local/gcc-5.4.0

下,編譯過程十分漫長,我的筆記本用了兩三個小時,公司的電腦只用了一個小時,編譯安在完成後需要重啟電腦:

init 6

重起後就可以通過gcc -v來檢視gcc版本,現在已經是5.4.0了,所以我決定寫一個小程式來測試一下,編譯程式沒有問題,但是執行的時候出現"./a.out: /lib64/libstdc++.so.6:version 'GLIBCXX_3.4.21' not found(required by ./a.out)",所以接下來需要解決這個問題。

三、解決執行程式gcc出現'GLIBCXX_3.4.21' not found

這是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫導致的,將gcc最新版本的動態庫替換系統中老版本的動態庫即可解決,執行以下命令檢查動態庫:

strings /lib64/libstdc++.so.6 | grep GLIBC

以下是輸出結果:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH
從輸出結果可以看到並沒有“GLIBCXX_3.4.21“,所以可以斷定我們的程式執行時動態載入的是老的動態庫,解決這個問題需要將當前連結檔案的連結指向改成最新的動態庫地址:

cp /usr/local/lib64/libstdc++.so.6.0.21 /lib64 cd /lib64 rm -rf libstdc++.so.6 ln -s libstdc++.so.6.0.21 libstdc++.so.6

然後你可以執行以下命令來檢視'GLIBCXX_3.4.21'已經可以找到了:

strings /lib64/libstdc++.so.6 | grep GLIBC

解決了這個問題終於可以執行程式了,然後又測試了-g選項來編譯程式,編譯好程式除錯程式時並不能夠設定斷點以及print變數的值,gdb除錯中出現:Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.e17_2.6.x86_4 libgcc-4.8.5-4.e17.x86_64的問題,通過上網查閱資料,是因為gcc版本和gdb版本並不匹配,或者說gdb版本過低,我的gdb版本是7.6.1,是2013年的,現在最新的是7.11.1,所以我決定直接升級到最新版本。

四、編譯安裝gdb-7.11.1

到官網http://ftp.gnu.org/gnu/gdb/直接下載最新的版本並進行編譯安裝:

tar -xvf gdb-7.11.1.tar.gz
cd gdb-7.11.1
./configure
make make install

整個編譯過程持續15分鐘左右,當執行make install時gdb安裝出現了錯誤:WARNING: 'makeinfo' is missing on your sysem,則需安裝相關依賴程式:

yum install texinfo libncurses5-dev

依賴安裝完成後重新執行make install就可以了,然後重新啟動電腦:

init 6

重起後就可以通過gdb -v來檢視gdb版本,現在已經是7.11.1了,但是當除錯程式時出現下面資訊時:

warning: File "/usr/local/lib64/libstdc++.so.6.0.21-gdb.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load". To enable execution of this file add add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.21-gdb.py line to your configuration file "/root/.gdbinit". To completely disable this security protection add set auto-load safe-path / line to your configuration file "/root/.gdbinit".

將以下資訊放入~/.gdbinit就可以了:

add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.21-gdb.py set auto-load safe-path /

若想通過gdb來除錯STL容器,則還需要做一些配置,可以通過GDB Python pretty printers來解決這個問題:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python stlPrettyPrinter
mv stlPrettyPrinter /usr/local

然後將下面的配置資訊放入~/.gdbinit

python
import sys
sys.path.insert(0, '/usr/local/stlPrettyPrinter')
from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None) end

更多有關GDB Python pretty printers的資訊可以點選這裡