CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本
Centos 7默認gcc版本為4.8,有時需要更高版本的,這里以升級至8.3.1版本為例(升級gcc7系列也是類似的步驟),分別執行下面三條命令即可,無需手動下載源碼編譯
1、安裝centos-release-scl
sudo yum install centos-release-scl
2、安裝devtoolset,注意,如果想安裝7.*版本的,就改成devtoolset-7-gcc*,以此類推
sudo yum install devtoolset-8-gcc*
3、激活對應的devtoolset,所以你可以一次安裝多個版本的devtoolset,需要的時候用下面這條命令切換到對應的版本
scl enable devtoolset-8 bash
大功告成,查看一下gcc版本
gcc -v
顯示為?gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
補充:這條激活命令只對本次會話有效,重啟會話后還是會變回原來的4.8.5版本,要想隨意切換可按如下操作。
首先,安裝的devtoolset是在 /opt/rh 目錄下的,如圖
?每個版本的目錄下面都有個 enable 文件,如果需要啟用某個版本,只需要執行
source ./enable
所以要想切換到某個版本,只需要執行
source /opt/rh/devtoolset-8/enable
可以將對應版本的切換命令寫個shell文件放在配了環境變量的目錄下,需要時隨時切換,或者開機自啟
4、直接替換舊的gcc
舊的gcc是運行的 /usr/bin/gcc,所以將該目錄下的gcc/g++替換為剛安裝的新版本gcc軟連接,免得每次enable
mv /usr/bin/gcc /usr/bin/gcc-4.8.5? ? ?【備份舊的gcc】
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc? ? 【替換為新的gcc軟鏈接】
mv /usr/bin/g++ /usr/bin/g++-4.8.5? ? 【備份舊的g++】
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++? ?【替換為新的g++軟鏈接】
gcc --version
g++ --version
編譯安裝gcc4.9.1 - gcc5xxx
一、安裝開發必備環境:
yum groupinstall "Development Tools" yum install glibc-static libstdc++-static二、編譯安裝gcc-4.9.4
你可以到官網下載gcc,也可以直接在這里下載:Index of /software/gcc/releases??下載好后進行編譯安裝:
wget? http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.4/gcc-4.9.4.tar.gz
tar -zxvf gcc-4.9.4.tar.gz cd gcc-4.9.4 ./contrib/download_prerequisites 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/bin下,編譯過程十分漫長,我的筆記本用了兩三個小時,公司的電腦只用了一個小時,編譯安裝在完成后需要重啟電腦:
init 6重起后就可以通過gcc -v來查看gcc版本,現在已經是4.9.4了。
三、測試【有坑,踩平】
所以我決定寫一個小程序來測試一下,編譯程序沒有問題,但是運行的時候出現:
"./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 addadd-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 addset 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的信息可以點擊這里。
五、Cmake指定gcc版本
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
把這兩個變量配置在 ~/.bash_profile? 登錄自動生效,這樣不用每次修改?。
六、懸而未決的問題
gcc4.8.5 升級到gcc ?5.2 ?isl' Makefile:663: *** missing separator. ?Stop
總結
以上是生活随笔為你收集整理的CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高效率读写文件方法比较
- 下一篇: C++二维数组按行遍历和按列遍历的区别