安裝gcc須要GMP、MPFR、MPC這三個庫,可從ftp://gcc.gnu.org/pub/gcc/infrastructure/下載相應的壓縮包。因爲MPFR依賴GMP,而MPC依賴GMP和MPFR,因此要先安裝GMP,其次MPFR,最後纔是MPC。這裏三個庫我用的版本分別是gmp4.3.2,mpfr2.4.2和mpc0.8.1。node
先開始安裝GMP。解壓GMP的壓縮包後,獲得源代碼目錄gmp-4.3.2。在該目錄的同級目錄下創建一個臨時的編譯目錄,這裏命名爲gmp-build。而後開始配置安裝選項,進入gmp-build目錄,輸入如下命令進行配置:linux
../gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2c++
這裏--prefix選項表明要將該庫安裝在哪裏,我是裝在/usr/local/gmp-4.3.2目錄下,後面的安裝都會用到這個選項。 shell
這時在gmp的編譯目錄下就會生成一個makefile文件,如今開始編譯安裝。bash
makepost
make check測試
sudo make installui
這樣就安裝好了gmp。mpfr和mpc的安裝方法與此相似。不過要注意配置的時候要把依賴關係選項加進去,具體後面兩個庫配置命令以下:spa
../mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
../mpc-0.8.1/configure --prefix=/usr/local/mpc-0.8.1 --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2
安裝好這三個庫以後,就能夠正式開始安裝gcc了。
與此前同樣,先建一個編譯gcc的臨時目錄gcc-build,進入該目錄後配置安裝選項:
../gcc-4.7.2/configure --prefix=/usr/local/gcc-4.7.2 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++
--with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1
gcc的配置選項有不少,具體能夠參考gcc源文件目錄下的安裝說明。這裏只安裝了c和c++的編譯器。(若是不指定編譯的語言,則會在make時不經過,爆出某些文件找不到等錯誤,因此仍是建議在此指定編譯語言爲c,c++)
在環境變量LD_LIBRARY_PATH添加前面三個庫的位置,鍵入如下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-0.8.1/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib
而後開始make編譯
在通過漫長的1小時等待後,終於編譯完成。在安裝說明裏面還有測試這一步,不過那是可選的。直接make install安裝,至此gcc就所有安裝完成了。不過目前還不能使用新版本的gcc,由於新版的可執行文件還沒加到命令的搜索路徑中。在這裏我爲新版的gcc和g++命令分別創建了一個軟連接。進入/usr/bin目錄後,鍵入以下命令創建軟連接。
sudo ln -s /usr/local/gcc-4.5.0/bin/gcc gcc472
sudo ln -s /usr/local/gcc-4.5.0/bin/g++ g++472
在這裏遇到個問題
sudo: error while loading shared libraries: libssl.so.0.9.8: cannot open shared object file: No such file or directory
sudo: error while loading shared libraries: libcrypto.so.0.9.8: cannot open shared object file: No such file or directory
輸入locate libssl.so.0.9.8發現系統沒有libssl.so.0.9.8,因而下載,下載第地址
http://www.it-adv.net/fetion/downng/library_linux.tar.gz
解壓
[root@localhost local]# tar -zxvf library_linux.tar.gz
libACE-5.6.8.so
libACE_SSL-5.6.8.so
libcrypto.so.0.9.8
libssl.so.0.9.8
將缺乏的拷貝到 /usr/local/lib 下,這是由於/etc/ld.so.conf中包含了這個路徑
cp libcrypto.so.0.9.8 /usr/local/lib
cp libssl.so.0.9.8 /usr/local/lib
而後
sudo ldconfig
解決
這樣我使用新版本gcc的時候就能夠用gcc472和g++472命令,同時也可以使用原來的gcc編譯程序。固然這裏也能夠直接將/usr/bin目錄下gcc,g++命令從新連接到新版本的gcc可執行文件。在正式使用以前還有最後一個工做要作,就是將前面安裝的三個庫的路徑加進環境變量LD_LIBRARY_PATH中,否則在編譯程序的時候會出錯。因爲我不想每次編譯程序都生成環境變量,因此須要編輯/etc目錄下的bashrc文件配置shell環境。在這個文件中添加如下語句:
LD_LIBRARY_PATH=:/usr/local/mpc-0.8.1/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib:/usr/local/gcc-4.7.2/lib
export LD_LIBRARY_PATH
保存重啓系統後,就可使用新裝的gcc了。
解決相似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的問題
2015年10月17日 2682
源碼編譯升級安裝了gcc
後,編譯程序或運行其它程序時,有時會出現相似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
的問題。這是由於升級gcc
時,生成的動態庫沒有替換老版本gcc
的動態庫致使的,將gcc
最新版本的動態庫替換系統中老版本的動態庫便可解決。
1. 問題緣由分析
爲了安裝最新版本的Node.js
(最新版本的Node.js
使用了C++ 11
中,而C++ 11
須要code>gcc 4.8+才能支持),將gcc
升級到了當前最新版本v 5.2.0
。升級後,成功編譯安裝了新版本的Node.js
(v 4.2.1
),但運行時程序時出現瞭如下錯誤:
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
運行如下命令檢查動態庫:
strings /usr/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_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
從以上輸出能夠看出,gcc
的動態庫仍是舊版本的。說明出現這些問題,是由於升級gcc
時,生成的動態庫沒有替換老版本gcc
的動態庫。
2. 問題處理
執行如下命令,查找編譯gcc
時生成的最新動態庫:
find / -name "libstdc++.so*"
輸出以下:
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 //最新動態庫
……
/home/gcc-5.2.0/gcc-temp
是升級gcc時的輸出目錄。
將上面的最新動態庫libstdc++.so.6.0.21
複製到/usr/lib64
目錄下:
cp /home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64
複製後,修改系統默認動態庫的指向,即:重建默認庫的軟鏈接。
切換工做目錄至/usr/lib64
:
cd /usr/lib64
刪除原來軟鏈接:
rm -rf libstdc++.so.6
將默認庫的軟鏈接指向最新動態庫:
ln -s libstdc++.so.6.0.21 libstdc++.so.6
默認動態庫升級完成。從新運行如下命令檢查動態庫:
strings /usr/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
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH