ubuntu12.04编译gcc-4.2.3源代码

简介:

最近需要编译openoffice这个大型的开源办公软件,可是编译openoffice的软件要求第一个就有对gcc版本的有要求。

我看了网上的经验,有人使用gcc-4.4.5都不能编译openoffice,而ubuntu下面apt-get install能安装的gcc最低版本就是gcc-4.4.5。

所以我这里需要自己编译gcc。我这里打算编译gcc-4.2.3版本。


我的系统软件版本情况如下(供参考):

ubuntu12.04

gcc-4.6.3

目的:编译gcc-4.2.3


1.获取代码及新建目录

1.1下载

我是通过http://gcc.gnu.org/mirrors.html下载的。

1.2解压

$ tar xvjf gcc-4.1.2.tar.bz2
在ubuntu12.04自带了解压缩软件,可以直接通过右键菜单就可以解压。

1.3 建立目录

假设你解压到的目录为:  ~/home/hwh/gcc-4.2.3,那么我们就用${srcdir}表示它。

我们同时需要建立一个目标目录${objdir}用来存放编译结果的地方,GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。我们这里在建立一个objdir为: ~/home/hwh/gcc-4.2.3obj

~$ mkdir gcc-4.2.3obj
~$ cd gcc-4.2.3obj

同时我们还需要建立一个安装目录,就是防止编译后的头文件,库文件,和可执行文件。

一般为/usr/local/gcc-4.2.3

命令:

~$ cd /usr/local
~$ sudo mkdir gcc-4.2.3
// 输入密码

最终我们有3个目录

${srcdir}             ~/home/hwh/gcc-4.2.3                          源代码解压后的目录

${objdir}             ~/home/hwh/gcc-4.2.3obj                    自己新建的用于存放编译结果的目录,以后的操作都在这个目录里面

${destdir}          /usr/local/gcc-4.2.3                                用来安装编译结果的目录


3. 安装依赖库及相关软件

$ sudo apt-get install libc6-dev libgmp-dev libmpfr-dev texinfo

这个需要根据http://gcc.gnu.org/install/prerequisites.html里面的要求下载依赖库。

上面我安装了常规需要依赖的库。


4. 为头文件以及所需库添加链接

添加如下链接, 这取决于你的 Ubuntu 系统架构, 如果你使用的是64位的ubuntu系统应当使用x86_64-linux-gnu替代i386-linux-gnu

$ cd /usr/include
$ sudo ln -s i386-linux-gnu/bits bits
$ sudo ln -s i386-linux-gnu/gnu gnu
$ sudo ln -s i386-linux-gnu/sys sys
$ sudo ln -s i386-linux-gnu/asm asm
$ cd /usr/lib
$ sudo ln -s i386-linux-gnu/crt1.o crt1.o
$ sudo ln -s i386-linux-gnu/crti.o crti.o
$ sudo ln -s i386-linux-gnu/crtn.o crtn.o 

[这里需要了解一下ln -s 的语法:

sudo ln -s 源文件 目标文件

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,
我们只要在某个固定的目录放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁
盘空间。

具体大家可以谷哥或度娘,但是提供一个地址供参考:http://blog.chinaunix.net/uid-26942706-id-3207669.html

]



5. 配置

配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。

配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${destdir}):

命令格式为:

% ${srcdir}/configure --prefix=${destdir} [其它选项] 

但是其他选项如此多,怎么办?

我参考了系统自带gcc-4.6.3的编译参数(使用gcc -v查看),然后将不相关的配置选项都删除了。

 最终我的配置为:

$ ../gcc-4.2.3/configure --prefix=/usr/local/gcc-4.2.3 --enable-threads=posix 
--disable-checking --enable--long-long --build=i686-linux-gnu 
--host=i686-linux-gnu --target=i686-linux-gnu --with-system-zlib --enable-languages=c,c++,java


6. 编译

命令:

$ make
这是一个漫长的过程,并且可能出现N多错误,不要怕,有谷哥和度娘呢。

晚上每个人编译的错误情况都不相同,我就将我所遇到的错误及解决办法帖出来,供大家参考。

问题:
a. 错误码:"java/jcf-io.c: cann't find zlib.h"?
[Method]: 将/gcc-4.2.3/gcc/java下的jcf-io.c中的#include "zlib.h"
修改为#include "../../zlib/zlib.h"

b. 错误码:"/usr/bin/ld: cannot find -lz"?
[Method]: 安装zlib-dev这个包,在线安装命令为:apt-get install zlib1g-dev。

c. 错误码:"xgcc: java/parse-scan.c: No such file or directory"?
[Method]:
<1>安装bison: sudo apt-get install bison
<2>进入gcc-4.2.3/gcc/java目录,因该目录有parse-scan.y
执行bison -t -o parse-scan.c parse-scan.y


7. 安装

安装很简单:

~$ sudo make install


8.替换系统自带gcc-4.6.3为我们新编译的gcc-4.2.3

知识储备:GCC 4.6.3的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。


8.1查看原来gcc所在路径

~$ which gcc
/usr/bin/gcc
原来的gcc命令在/usr/bin目录下。因此我们可以把GCC 4.6.3中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接:

(这里你可以根据你的需要链接gcc, g++, gcj)

 % cd /usr/bin
 % ln -s ${destdir}/bin/gcc-4.2 gcc
 % ln -s ${destdir}/bin/g++-4.2 g++
 % ln -s ${destdir}/bin/gcj-4.2 gcj 

上述含义就是将gcc链接到gcc-4.2中。


9. 测试

使用gcc -v检查版本应该为gcc-4.2.3了。




参考:

参考资料1:

1. http://blog.csdn.net/sstower/article/details/5624010

2004年4月20日最新版本的GCC编译器3.4.0发布了。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。GCC 3.4.0比以前版本更好地支持了C++标准。本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程。

 安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的GCC 3.4.0。如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。

 系统上原来的GCC编译器可能是把gcc等命令文件、库文件、头文件等分别存放到系统中的不同目录下的。与此不同,现在GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);缺点是在安装完成后要做一些设置工作才能使编译器工作正常。在本文中我采用这个方案安装GCC 3.4.0,并且在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。

 按照本文提供的步骤和设置选项,即使以前没有安装过GCC,也可以在系统上安装上一个可工作的新版本的GCC编译器。

 1. 下载

 在GCC网站上(<a href="gcc.gnu/" target="_blank">gcc.gnu/</a>)或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.4.0。可供下载的文件一般有两种形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。

 2. 解压缩

 根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):

 % tar xzvf gcc-3.4.0.tar.gz
 或者
 % bzcat gcc-3.4.0.tar.bz2 | tar xvf -

 新生成的gcc-3.4.0这个目录被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。用pwd命令可以查看当前路径。

 在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。

 3. 建立目标目录

 目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。

 例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录):

 % mkdir gcc-build
 % cd gcc-build

 以下的操作主要是在目标目录 ${objdir} 下进行。

 4. 配置

 配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。

 配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${destdir}):

 % ${srcdir}/configure --prefix=${destdir} [其它选项]

 例如,如果想将GCC 3.4.0安装到/usr/local/gcc-3.4.0目录下,则${destdir}就表示这个路径。

 在我的机器上,我是这样配置的:

 % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java

 将GCC安装在/usr/local/gcc-3.4.0目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。

 5. 编译

 % make

 这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。

 6. 安装

 执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限):

 % make install

 至此,GCC 3.4.0安装过程就完成了。

 6. 其它设置

 GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到并使用它们。

 6.1 gcc、g++、gcj的设置

 要想使用GCC 3.4.0的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。

 首先,查看原来的gcc所在的路径:

 % which gcc

 在我的系统上,上述命令显示:/usr/bin/gcc。因此,原来的gcc命令在/usr/bin目录下。我们可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接:

 % cd /usr/bin
 % ln -s ${destdir}/bin/gcc gcc34
 % ln -s ${destdir}/bin/g++ g++34
 % ln -s ${destdir}/bin/gcj gcj34

 这样,就可以分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。

 6.2 库路径的设置

 将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。

 例如,如果GCC 3.4.0安装在/usr/local/gcc-3.4.0目录下,在RH Linux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句:

 setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH

 7. 测试

 用新的编译命令(gcc34、g++34等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。

 8. 根据需要,可以删除或者保留${srcdir}和${objdir}目录。


参考资料2:

http://hi.baidu.com/zhujin2006/item/7426c74c75e680d3c1a59289

由于项目需要,需要安装gcc4.0.2,其中的步骤参考gcc源代码里INSTALL目录下
的安装说明,偶也是菜鸟,希望对初学者有所帮助吧,欢迎拍砖:)

1.从gcc.gnu.org上下载了gcc4.0.2
有这么几个文件:
gcc-4.0.2.tar.bz2
gcc-core-4.0.2.tar.bz2
gcc-g++-4.0.2.tar.bz2
gcc-java-4.0.2.tar.bz2
gcc-testsuite-4.0.2.tar.bz2

其中gcc-4.0.2.tar.bz2是包含了所有语言的包,包括(c,cpp,java,ada...),如
果你只需要编译其中的若干语言,下载gcc-core-4.0.2.tar.bz2gcc的核心代码,再下
载你需要的语言包就可以了。偶下了一个g++和java,还有一个
gcc-testsuite-4.0.2.tar.bz
2测试套件,不过偶下了没有用,节省编译时间呵:)

2.解压gcc-core-4.0.2.tar.bz2到目录gcc-4.0.2,把gcc-g++-4.0.2.tar.bz2也解
压到gcc-4.0.2目录里,放在一起编译。

3.这里要注意:我们把源代码解压的目录叫做$srcdir,强烈建议再新建一个目录
用作gcc编译的目录,叫做$objdir,这个目录不要是$srcdir的子目录,这里是gcc-bui
ld。

$ mkdir gcc-build
$ cd gcc-build

以下的操作都在$objdir里。

4.configure
这里我偷了一个懒,由于configure需要编译参数,偶参考了一
下系统自带gcc的参数,gcc -v 查看

$ gcc -v
使用内建 specs。
目标:i486-linux-gnu
配置为:../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,
treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/
usr/lib --without-included-gettext --enable-threads=posix --enable-nls -
-program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable
-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with
-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --d
isable-werror --with-tune=pentium4 --enable-checking=release i486-linux-
gnu
线程模型:posix
gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)


由于gcc不带uninstal功能,为了便于删除,把gcc安装在自己定义的目录下,这样
把目录删除就可以删除gcc了。
新建目录 /usr/local/gcc-4.0.2,把它叫做$installdir

根据刚才gcc的参数,适当修改,我只需要g++,把关于java的参数都删掉了,进入
$objdir
 $srcdir/configure --prefix=$installdir --enable-languages=c,c++ --enab
le-shared --with-system-zlib --without-included-gettext --enable-threads
=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable
-clocale=gnu --enable-libstdcxx-debug --enable-gtk-cario --enable-mffr -
-disable-werror --with-tune=pentium4 --enable-checking=release i486-linu
x-gnu

这步生成makefile等文件

5.编译
$make bootstrap
对源代码进行编译
在我P4 2.8G的机器上用了大约半个小时的时间

6.安装
$make install
安装gcc到$installdir下

最后,查看为了使gcc命令调用自己编译的gcc,到/usr/bin下面把gcc链接到自己
编译的gcc上面
$cd /usr/bin
$file gcc
gcc: symbolic link to `gcc-4.0'
$ln -fs $installdir/bin/gcc-4.0 gcc
$gcc -v
root@castalia:/usr/bin# gcc -v
使用内建 specs。
目标:i486-linux-gnu
配置为:/home/zhuj/temp/gcc-4.0.2/configure --prefix=/usr/local/gcc-4.0
.2/ --enable-languages=c,c++ --enable-shared --with-system-zlib --withou
t-included-gettext --enable-threads=posix --enable-nls --program-suffix=
-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug
 --enable-java-awt=gtk-default --enable-gtk-cario --enable-mffr --disabl
e-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
线程模型:posix
gcc 版本 4.0.2

这样gcc就是我们自己编译的gcc了,如果需要系统原来的gcc,改变链接就ok了:)

ps:
 呵呵 ,如果没有必要,当然不会从源代码编译
 其实偶的一个项目需要一个开源软件,在linux平台上只有源代码,需要编译,而它
的readme里面指定要gcc4.0.2,偶试过,用4.0.0和4.1编译出来的都有问题,而
ubuntu的源里有一个4.0.3和3.x系列的gcc,偶不得已才为之,有的源代码对系统
条件是特别苛刻的,所以最好还是按照安装说明去安装,一开始偶就折腾了半天,
浪费了n宝贵的时间,呵呵,教训也是经验吧



参考资料3:

http://xwsoul.com/posts/548

最近在了解分布式文件系统, 看到了淘宝自己的开源分布式文件系统 tfs, 因为他要求编译最好是使用 4.1.2 版本的 gcc 编译, 因此需要安装此版本的 gcc.
其他少说, 直接开始安装吧:

1. 下载&解压源码

$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2
$ tar xvjf gcc-4.1.2.tar.bz2

2. 安装依赖库, 以及软件

$ sudo apt-get install libc6-dev libgmp-dev libmpfr-dev texinfo

3. 为头文件以及所需库添加链接
添加如下链接, 这取决于你的 Ubuntu 系统架构, 如果你使用的是64位的ubuntu系统应当使用x86_64-linux-gnu替代i386-linux-gnu

$ cd /usr/include
$ sudo ln -s i386-linux-gnu/bits bits
$ sudo ln -s i386-linux-gnu/gnu gnu
$ sudo ln -s i386-linux-gnu/sys sys
$ sudo ln -s i386-linux-gnu/asm asm
$ cd /usr/lib
$ sudo ln -s i386-linux-gnu/crt1.o crt1.o
$ sudo ln -s i386-linux-gnu/crti.o crti.o
$ sudo ln -s i386-linux-gnu/crtn.o crtn.o 

4. 编译gcc

$ cd gcc-4.1.2
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local --program-prefix=sse- --libexecdir=/usr/local/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --disable-multilib --enable-languages=c,c++
$ make bootstrap

如果出现了如下错误:

WARNING: `makeinfo’ is missing on your system. You should only need it
if you modified a `.texi’ or `.texinfo’ file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make’ (AIX,
DU, IRIX). You might want to install the `Texinfo’ package or
the `GNU make’ package. Grab either from any GNU archive site.

请使用以下命令编译:

$ make bootstrap MAKEINFO=makeinfo

5. 安装gcc

$ make install
$ cd /usr/local/bin
$ ll *gcc*

看到类似以下几个文件, 安装就完成了

i686-pc-linux-gnu-gcc-4.1.2 i686-pc-linux-gnu-ssegcc ssegcc ssegccbug


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值