最近需要自己升级操作系统的gcc版本,故浏览一遍gcc的wiki,顺带翻译一遍,以供后来者享用
------------------------------------------------------- 我是愉快的分割线 ------------------------------------------
- 为什么运行./configure和make会失败
- 如果在gcc源码目录进行configure和make,容易导致一些未知的问题。这一点在configuration page以及install document中都有描述
- 正确的做法是在gcc source code目录旁建立一个同级的gcc-build目录,然后在gcc-build目录中用绝对目录或相对路径运行configure,makefile将会在gcc-build目录中生成。
以上步骤对于gnu标准的package来说不太常见,这是为了使gcc源码目录不受编译文件的干扰而采取的措施,使得源码包可以以后重用
- configure或者make出现“configure:error: cannot compute suffix of object files:cannot compile”是什么原因呢?
像绝大多数gnu projects中的工具一样,gcc使用gnu autotools来对编译进行配置,configure脚本使用某种小程序,通常是conftest.c来测试系统是否对某些函数或者特性有支持。如果该测试fail,一般会输出这样的消息:
1 checking for suffix of object files... configure: error: in `/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc': 2 configure: error: cannot compute suffix of object files: cannot compile 3 See `config.log' for more details. 4 make[2]: *** [configure-stage1-target-libgcc] Error 1 5 make[2]: Leaving directory `/home/manu/gcc/gcc'
这样的消息通常比较具有误导性,通常需要去check出错目录下的config.log文件,在这个例子中,需要check下/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc路径下的config.log文件。error消息通常有多条,有些并不是很关键,通常做法是搜索最后的error message。
通常引起这类消息的原因是:
- gcc所依赖的第三方库没有找到,具体的说是MPFR, MPC, GMP三个包。如果已安装,查看库所在的链接是否包含在链接器的搜索路径中
- 编译器异常,这种情况应该极少会见到
- 编译由于类似这样的错误“fatal error: gnu/stubs-32.h: No such file or directory"而失败了,是什么原因?
默认情况下gcc会安装对于32位和64位的支持,但是在某些GNU/LINUX分发中没有对应的32位glibc头文件的支持。解决这个问题的方案是:1.安装32位glibc的相关包libc6-dev, libc6-dev-i386, glibc-devel.i686等或者去掉gcc对于32位的支持:--disable-multilib
- 当我新安装了一个版本的gcc之后,如何切换到新的gcc?
建立一个新的脚本/etc/profile.d/gcc492.sh内容为:
export PATH=/usr/local/gcc-4.9.2/bin/:$PATH
其实也就是把新gcc的bin目录加入到PATH环境变量中
- 再一个可能遇到的问题是安装某些包的时候遇到/usr/lib64/libstdc++.so.6 ‘GLIBC_3.4.15 not found’ 这样的错误,往往是因为你make install 新版本gcc的时候并不会把libstdc++库更新,所以需要手动更新一下