Linux上编译和安装GCC
作者: | A.TNG |
---|---|
邮箱: | jiyucn@163.com |
参考: | Installation document of GCC |
时间: | 4/13/2008 |
前言
最近在构建一套开发环境,对GCC有特殊的要求,使用RPM包安装 的GCC已经不能满足要求了,因此决定手动编译安装GCC。
原本想走一些捷径,希望RPM包安装也可以达到手动安装的灵活性, 后来发现此路不通;接下来又想找网络上是否提供编译好的tar包下 载,解压后就可直接运行,后来发现GCC平台依赖性很强,此路亦 不通。
于是只能选择源代码编译和安装GCC了。
第一步:准备工作
我是从一台最小化安装CentOS 5的Linux PC上开始安装GCC的, 其实如果你有一台安装了开发环境的Linux PC,则可以跳过这一 步。
首先,机器上必须安装好GCC,才能够从源代码编译和安装新的GCC, 因此我安装了下列RPM包作为开发环境。(注意,我的系统是 CentOS 5,其他平台可以选择相关的开发工具包)。
- rpm -ivh cpp-4.1.1-52.el5.i386.rpm
- rpm -ivh glibc-headers-2.5-12.i386.rpm
- rpm -ivh glibc-devel-2.5-12.i386.rpm
- rpm -ivh libgomp-4.1.1-52.el5.i386.rpm
- rpm -ivh gcc-4.1.1-52.el5.i386.rpm
- rpm -ivh libstdc++-devel-4.1.1-52.el5.i386.rpm
- rpm -ivh gcc-c++-4.1.1-52.el5.i386.rpm
- rpm -ivh zlib-devel-1.2.3-3.i386.rpm
安装完以上的工具包后,系统中gcc/g++命令就可用了。
GCC的tar包里面提供了test suite,编译完成后可以执行这些测试, 用以分析编译是否成功。因此系统中需要安装另外的工具包:
- rpm -ivh expect-5.43.0-5.1.i386.rpm
- rpm -ivh dejagnu-1.4.4-5.1.noarch.rpm
安装完以上工具包后,系统中runtest命令就可以用了。
第二步:configure和make
configure
configure是个很关键的步骤,如果遇到编译错误,首先应该想到 可能是configure的问题,接下来想到可能是系统中缺少相关的软 件包,编译过程中找不到头文件等。
我使用的编译参数是:
./configure --prefix=/opt/gcc-x.y.z --enable-shared /
--enable-threads=posix --enable-clocale=gnu /
--enable-__cxa_atexit --disable-checking /
--enable--long-long
依次解释:
- --prefix=/opt/gcc-x.y.z 是用来指定安装目录,注意,该目录尽量不要与源代码是同一目录, 也不能是源代码的子目录。
- --enable-shared 创建共享库
- --enable-threads=posix 启用线程支持,在某些平台上是默认值。它对Obj-C的库以及C++、 Java的异常处理有影响。
- --enable-clocale=gnu 本参数确保C++库在任何情况下都使用正确的locale 模块。如果配置脚本查找到de_DE这个locale,它就会 使用正确的gnu模块。然而,有的人没有安装de_DE,就有可能创建 出ABI不兼容的C++库文件,这是因为错误的使用了generic作为 locale模块。
- --enable-__cxa_atexit 使用 __cxa_atexit来代替 atexit,用来记录本地和全局的 C++ destructors,这是为了完全符合标准的规定。它还会影响到C++ ABI, 因此生成的C++共享库,在其他的Linux发行版上也能使用。
- --disable-checking 为节省编译时间,我们使用此选项,对结果没有影响。
- --enable--long-long 支持long long数据类型,某些开源项目使用了该数据类型。
完成configure工作后,会自动生成Makefile,接下来就可以开始漫长 的编译工作了。
如果configure的参数把你绕得很晕, 传递尽量少的参数给configure,默认 的参数在大多数情况下是适用的。
第三步:执行测试(可选)
GCC的tar包里面提供了test suite,帮助进行测试,用来分析编译是否 成功。
执行如下命令开始测试:
make -k check > check.log
同样,这是个漫长的过程。
测试完成后,可以访问 http://gcc.gnu.org/buildstat.html ,对比测试结果。