CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本
Centos 7默認(rèn)gcc版本為4.8,有時(shí)需要更高版本的,這里以升級(jí)至8.3.1版本為例(升級(jí)gcc7系列也是類似的步驟),分別執(zhí)行下面三條命令即可,無(wú)需手動(dòng)下載源碼編譯
1、安裝centos-release-scl
sudo yum install centos-release-scl
2、安裝devtoolset,注意,如果想安裝7.*版本的,就改成devtoolset-7-gcc*,以此類推
sudo yum install devtoolset-8-gcc*
3、激活對(duì)應(yīng)的devtoolset,所以你可以一次安裝多個(gè)版本的devtoolset,需要的時(shí)候用下面這條命令切換到對(duì)應(yīng)的版本
scl enable devtoolset-8 bash
大功告成,查看一下gcc版本
gcc -v
顯示為?gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
補(bǔ)充:這條激活命令只對(duì)本次會(huì)話有效,重啟會(huì)話后還是會(huì)變回原來(lái)的4.8.5版本,要想隨意切換可按如下操作。
首先,安裝的devtoolset是在 /opt/rh 目錄下的,如圖
?每個(gè)版本的目錄下面都有個(gè) enable 文件,如果需要啟用某個(gè)版本,只需要執(zhí)行
source ./enable
所以要想切換到某個(gè)版本,只需要執(zhí)行
source /opt/rh/devtoolset-8/enable
可以將對(duì)應(yīng)版本的切換命令寫個(gè)shell文件放在配了環(huán)境變量的目錄下,需要時(shí)隨時(shí)切換,或者開機(jī)自啟
4、直接替換舊的gcc
舊的gcc是運(yùn)行的 /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
一、安裝開發(fā)必備環(huán)境:
yum groupinstall "Development Tools" yum install glibc-static libstdc++-static二、編譯安裝gcc-4.9.4
你可以到官網(wǎng)下載gcc,也可以直接在這里下載:Index of /software/gcc/releases??下載好后進(jìn)行編譯安裝:
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來(lái)編譯,雖然可以縮短編譯時(shí)間,但極大可能會(huì)編譯失敗) make install其中執(zhí)行?./contrib/download_prerequisits?將自動(dòng)下載以下幾個(gè)文件,這個(gè)幾個(gè)文件在gcc編譯時(shí)需要:
- mpfr-2.4.2.tar.bz2
- gmp-4.3.2.tar.bz2
- mpc-0.8.1.tar.gz
- isl-0.15.tar.bz2
由于網(wǎng)絡(luò)條件不是很好,在下載這幾個(gè)文件時(shí)很久都下載不下來(lái),所以我中斷了很多次,并刪除下載了的文件,重新執(zhí)行./contrib/download_prerequisits命令,下載完成后在configure時(shí)配置一些選項(xiàng),我沒(méi)有使用--prefix,在make install時(shí)將自動(dòng)安裝到/usr/local/bin下,編譯過(guò)程十分漫長(zhǎng),我的筆記本用了兩三個(gè)小時(shí),公司的電腦只用了一個(gè)小時(shí),編譯安裝在完成后需要重啟電腦:
init 6重起后就可以通過(guò)gcc -v來(lái)查看gcc版本,現(xiàn)在已經(jīng)是4.9.4了。
三、測(cè)試【有坑,踩平】
所以我決定寫一個(gè)小程序來(lái)測(cè)試一下,編譯程序沒(méi)有問(wèn)題,但是運(yùn)行的時(shí)候出現(xiàn):
"./a.out: /lib64/libstdc++.so.6:version 'GLIBCXX_3.4.21' not found(required by ./a.out)",
所以接下來(lái)需要解決這個(gè)問(wèn)題。
四、解決運(yùn)行程序gcc出現(xiàn)'GLIBCXX_3.4.21' not found
這是因?yàn)樯?jí)gcc時(shí),生成的動(dòng)態(tài)庫(kù)沒(méi)有替換老版本gcc的動(dòng)態(tài)庫(kù)導(dǎo)致的,將gcc最新版本的動(dòng)態(tài)庫(kù)替換系統(tǒng)中老版本的動(dòng)態(tài)庫(kù)即可解決,運(yùn)行以下命令檢查動(dòng)態(tài)庫(kù):
strings /lib64/libstdc++.so.6 | grep GLIBC以下是輸出結(jié)果:
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
從輸出結(jié)果可以看到并沒(méi)有“GLIBCXX_3.4.21“,所以可以斷定我們的程序運(yùn)行時(shí)動(dòng)態(tài)加載的是老的動(dòng)態(tài)庫(kù),解決這個(gè)問(wèn)題需要將當(dāng)前鏈接文件的鏈接指向改成最新的動(dòng)態(tài)庫(kù)地址:
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然后你可以執(zhí)行以下命令來(lái)查看'GLIBCXX_3.4.21'已經(jīng)可以找到了:
strings /lib64/libstdc++.so.6 | grep GLIBC解決了這個(gè)問(wèn)題終于可以執(zhí)行程序了.
然后又測(cè)試了-g選項(xiàng)來(lái)編譯程序,編譯好程序調(diào)試程序時(shí)并不能夠設(shè)置斷點(diǎn)以及print變量的值,gdb調(diào)試中出現(xiàn):Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.e17_2.6.x86_4 libgcc-4.8.5-4.e17.x86_64的問(wèn)題,通過(guò)上網(wǎng)查閱資料,是因?yàn)間cc版本和gdb版本并不匹配,或者說(shuō)gdb版本過(guò)低,我的gdb版本是7.6.1,是2013年的,現(xiàn)在最新的是7.11.1,所以我決定直接升級(jí)到最新版本。
四、編譯安裝gdb-7.11.1?
到官網(wǎng)http://ftp.gnu.org/gnu/gdb/直接下載最新的版本并進(jìn)行編譯安裝:
tar -xvf gdb-7.11.1.tar.gz cd gdb-7.11.1 ./configure make make install整個(gè)編譯過(guò)程持續(xù)15分鐘左右,當(dāng)執(zhí)行make install時(shí)gdb安裝出現(xiàn)了錯(cuò)誤:WARNING: 'makeinfo' is missing on your sysem,則需安裝相關(guān)依賴程序:
yum install texinfo libncurses5-dev依賴安裝完成后重新執(zhí)行make install就可以了,然后重新啟動(dòng)電腦:
init 6重起后就可以通過(guò)gdb -v來(lái)查看gdb版本,現(xiàn)在已經(jīng)是7.11.1了,但是當(dāng)調(diào)試程序時(shí)出現(xiàn)下面信息時(shí):
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 /若想通過(guò)gdb來(lái)調(diào)試STL容器,則還需要做一些配置,可以通過(guò)GDB Python pretty printers來(lái)解決這個(gè)問(wèn)題:
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更多有關(guān)GDB Python pretty printers的信息可以點(diǎn)擊這里。
五、Cmake指定gcc版本
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
把這兩個(gè)變量配置在 ~/.bash_profile? 登錄自動(dòng)生效,這樣不用每次修改?。
六、懸而未決的問(wèn)題
gcc4.8.5 升級(jí)到gcc ?5.2 ?isl' Makefile:663: *** missing separator. ?Stop
總結(jié)
以上是生活随笔為你收集整理的CentOS 7升级gcc 8.3.1 7.x.x 4.9.4版本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高效率读写文件方法比较
- 下一篇: 期货品种缩写