概述
最近在學習《深入應用C11-代碼與優化與工程級應用》,我的gcc版本是gcc-4.8.5是支持C11的,但是我在作者的github上看了一些C例子,其中有些是C14的語法,我的gcc版本並不支持,之前安裝了ubuntu16.04LTS,該系統的gcc版本是5.3.1這個是支持C++14的,所以我打算用ubuntu16.04LTS來作為開發系統算了,但后來又想折騰一些自己沒有做過的事情可以作為經驗積累,所以我又放棄了使用現成的ubuntu16.04LTS,經過三晚的折騰終於將Centos的gcc升級到了5.4.0,現在最新的gcc版本是6.1.0,本來打算直接升級到6.1.0的,但是在升級過程中遇到了一些問題,主要是兩個gcc版本跨度過大,不能夠一步升級成功,所以我決定升級到5.4.0,我現在將編譯安裝gcc的步驟以及踩的坑記錄了下來。
一、安裝開發必備環境:
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
的信息可以點擊這里。
五、總結
折騰一些我們沒有接觸過的東西將學習到很多新的知識或經驗。