看板 NCTU_CS_EDA 關於我們 聯絡資訊
為了避免自己忘記,先 PO 在這做個紀錄XD 一般來說如果能直接用套件管理員更新所要的套件的話當然最好 因為這樣比較方便,管理上也比較輕鬆~ 不過這次之所以會想更新 gcc 主要是現在 server 的 gcc 版本不夠新 有些 c++0x 的東西還沒有支援,因為不想重寫 code 所以乾脆就把 gcc 更新一下XD (關於 C++0x 有支援什麼東西請見 reference) 更新 gcc 所需的套件可在以下的 GNU 網站上下載 http://www.gnu.org/software/software.html 這次我的作法是下載 gcc 的 source 下來自己重新編這樣 要手動更新任何套件第一件要注意的事情就是套件相依性的問題 要如何得知這個套件跟那些套件有相依性可以在 $ configure 跑完後看結果,如果相依性沒有問題就會跑出 Makefile 讓你 compile 有問題的畫看一下 error message 或是 log 就可以知道還少了那些東西 gcc 的相依套件有這些:gmp, mpfr, mpc 其中 mpfr 相依 gmp、mpc 相依 gmp 跟 mpfr 所以安裝順序一定是 gmp -> mpfr -> mpc -> gcc 順序不能錯! 不過如果系統已經有的東西當然也就不用裝了這樣~ 這次因為 server 上 3 個都版本都太舊,所以要從 gmp 開始編 這次編 gcc-4.6.2 分別用到的是 gmp-4.3.2、mpfr-2.4.2、mpc-0.8.1 接下來說明詳細步驟: 1. 首先先把所有套件找個地方解壓縮 一般可能會在 /tmp 這個資料夾底下 (因為這邊專門放雜物= =+) 2. 一般來說自己編的套件都會放在 /usr/local 這個資料夾底下 這邊沿用這個慣例,在 /usr/local 底下分別建了這 4 個資料夾: gmp-4.3.2、mpfr-2.4.2、mpc-0.8.1、gcc-4.6.2 3. 誠如前面所說,先編 gmp 這個套件: a. 先切到 /usr/local/gmp-4.3.2 這個資料夾裡 $ /tmp/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 --prefix 主要是設定之後 gmp 的相關東西要去哪裡找 (如果我沒記錯的話= =a) b. $ make c. $ make install 4. 再來編 mpfr 這個套件: a. 先切到 /usr/local/mpfr-2.4.2 這個資料夾裡 $ /tmp/mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2 --with-gmp 是設定在編 mpfr 時去找剛剛編好的 gmp b. $ make c. $ make install 5. 再來編 mpc 這個套件: a. 先切到 /usr/local/mpc-0.8.1 這個資料夾 $ /tmp/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 b. $ make c. $ make install 6. 以上都準備完畢後就可以來編恐怖的 gcc 了: 備註:因為 gcc 非常龐大,全部編完大概要一小時Orz 昨天因為一直搞不定重編了 3 次...累死我也...||| 建議可以搭配 screen 避免不能關掉 terminal 的窘境XD a. 先切到 /usr/local/gcc-4.6.2 這個資料夾 /tmp/gcc-4.6.2/configure --prefix=/usr/local/gcc-4.6.2 --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1 --enable-threads=posix --disable-checking --enable--long-long --enable-languages=c,c++ --with-system-zlib 以上是我在 server 上編 gcc 下的參數 這些 google 一下大概就會知道可以怎麼下了 b. $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH :/usr/local/gmp-4.3.2/lib :/usr/local/mpfr-2.4.2/lib :/usr/local/mpc-0.8.1/lib 注意,這一整行中間不要斷開,我只是因為這樣排版比較好看= =a 不過說真的這一行這時候不下好像不影響= =a c. $ make d. $ make install 7. 都編完後再來就是設定系統囉! a. 先利用以下指令找出 gcc/g++ 到底都是放在哪個資料夾裡: $ which gcc | sed 's/gcc//g' 在 server 上是在 /usr/bin 這裡 b. 再來在這邊建立一個 soft link 到剛剛編好的 gcc 那裡 $ ln -s /usr/local/gcc-4.6.2/bin/gcc /usr/bin/gcc g++ 也是: $ ln -s /usr/local/gcc-4.6.2/bin/g++ /usr/bin/g++ 備註:做這個 link 前可以先把舊的 gcc 改名 c. 再來為了要讓 gcc 能夠找到這些套件不用每次都重新設定 所以要設定一下 library path 設定方法可以附加在 LD_LIBRARY_PATH 後面 (如 6-b,可以直接寫死在 /usr/.bashrc) 或者是用下面這個方法:修改 /etc/ld.so.conf i. 在 /etc/ld.so.conf 這個檔案後面附加上下面這三行 /usr/local/gmp-4.3.2 /usr/local/mpfr-2.4.2 /usr/local/mpc-0.8.1 備註:可能只要 /usr/local/mpc-0.8.1 就夠了 不過為了省事我就乾脆全加了 ii. $ ldconfig (不要打錯喔,是 "L"dconfig) d. 之後要讓 GLIBCXX 可以抓到正確的版本: i. cp /usr/local/gcc-4.3.2/x86_64-unknown-linux-gnu /libstdc++-v3/src/.libs/libstdc++.so.6.0.16 /usr/lib 1、2 行那個路徑其實是連在一起的,不過他太長了只好斷開...||| gcc-4.6.2 找到的是 libstdc++.so.6.0.16 這個可能要看到時候編完後的數字是多少自己更動 另外在 server 上他是去 /usr/lib64 上找的 如果不知道是一個就先以 /usr/lib 為主 有問題再看他是說哪一個資料夾這樣XD ii. 再來先刪掉舊的 link: $ rm -f /usr/lib/libstdc++.so.6 iii. 然後 redirect link 到現在這個版本: $ ln -s /usr/lib/libstdc++.so.6.0.16 /usr/lib/libstdc++.so.6 8. 如果覺得 /tmp 裡的東西站著很礙眼這時候可以把它通通清空囉! 這樣就大功告成啦!! 之後可以用 $ gcc -v 確認 gcc 的版本 然後跑個測試程式看看會不會動囉! 要移除掉的話上面有些步驟就改成做 backup 而不是直接刪掉 然後把整個過程中多產生的檔案給刪了 再把修改過的檔案復原就可以了! References: 1. C++0x: http://en.wikipedia.org/wiki/C%2B%2B11 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.134.61
shininglion:這篇文章值 821 P 幣... 02/22 00:15
※ 編輯: shininglion 來自: 220.133.134.61 (02/22 00:17)