简介:
最近需要编译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:
最近在了解分布式文件系统, 看到了淘宝自己的开源分布式文件系统 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