作者shininglion (lionking - 辛巴)
看板NCTU_CS_EDA
标题[心得] update gcc
时间Wed Feb 22 00:15:31 2012
为了避免自己忘记,先 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
1F:→ shininglion:这篇文章值 821 P 币... 02/22 00:15
※ 编辑: shininglion 来自: 220.133.134.61 (02/22 00:17)