最近在學習《深刻應用C++11-代碼與優化與工程級應用》,個人gcc版本是gcc-4.8.5是支持C++11的,可是我在做者的github上看了一些C++例子,其中有些是C++14的語法,個人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的步驟以及踩的坑記錄了下來。python
yum groupinstall "Development Tools" yum install glibc-static libstdc++-static
你能夠到官網下載gcc,也能夠直接在這裏下載:http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/ 下載好後進行編譯安裝:c++
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編譯時須要:git
因爲網絡條件不是很好,在下載這幾個文件時好久都下載不下來,因此我中斷了不少次,並刪除下載了的文件,從新執行./contrib/download_prerequisits
命令,下載完成後在configure時配置一些選項,我沒有使用--prefix,在make install
時將自動安裝到/usr/local/gcc-5.4.0
下,編譯過程十分漫長,個人筆記本用了兩三個小時,公司的電腦只用了一個小時,編譯安在完成後須要重啓電腦:github
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)",因此接下來須要解決這個問題。ubuntu
這是由於升級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'已經能夠找到了:ide
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,因此我決定直接升級到最新版本。svn
到官網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
的信息能夠點擊這裏。
折騰一些咱們沒有接觸過的東西將學習到不少新的知識或經驗。