本文内容参考多个博客,记录比较随意,仅作为个人笔记查看。
简介:
由于要移植gcc,所以不得已只能做如此似乎多此一举的实验。。
我的系统软件版本情况如下(供参考):
ubuntu 16.04
gcc-5.4.0
目的:编译gcc-5.4.0
1.获取代码及新建目录
1.1下载
gcc官网所提供资源镜像
1.2解压
1.3 建立目录
假设你解压到的目录为: ~/home/hwh/gcc-4.2.3,那么我们就用${srcdir}表示它。
我们同时需要建立一个目标目录${objdir}用来存放编译结果的地方,GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。我们这里在建立一个objdir为: ~/home/hwh/gcc-4.2.3obj
同时我们还需要建立一个安装目录,就是防止编译后的头文件,库文件,和可执行文件。
一般为/usr/local/gcc-5.4.0
然而我直接建立在/home/ren/program里,只是测试
最终我们有3个目录
${srcdir} /home/ren/program/gcc-5 源代码解压后的目录
${objdir} /home/ren/program/gcc-build 自己新建的用于存放编译结果的目录,以后的操作都在这个目录里面
${destdir} /home/ren/program/gcc-dst 用来安装编译结果的目录
3. 安装依赖库及相关软件
$ sudo apt-get install libc6-dev libgmp-dev libmpfr-dev texinfo
这个需要根据http://gcc.gnu.org/install/prerequisites.html里面的要求下载依赖库。
上面我安装了常规需要依赖的库,但在编译时有些错误,所以后来又安装了一些库
还需要另外三个库才能成功编辑 gcc,这三个库分别是:mpc, mpfr 和 gmp,编译安装到gcc-dst或在编译gcc时用参数指明路径(我采用)
安装参考如下步骤:
====================================================================================
打开终端进入上述几个文件所在的目录:
1
2
|
cd
~
cd
Downloads
|
我们先开始编译 gmp 库
1
2
3
4
5
|
cd
gmp*
mkdir
build &&
cd
build
..
/configure
--prefix=
/usr/gcc_4_7
--build=x86_64-linux-gnu
make
sudo
make
install
|
几分钟后你将有一个已编译好和安装好的 gmp 库,如果一切顺利,恭喜你!
使用相同的步骤来编译 MPFR:
1
2
3
4
5
6
7
|
cd
..
cd
..
cd
mpfr*
mkdir
build &&
cd
build
..
/configure
--build=x86_64-linux-gnu --prefix=
/usr/gcc_4_7
--with-gmp=
/usr/gcc_4_7
make
sudo
make
install
|
紧接着是 MPC:
1
2
3
4
5
6
7
|
cd
..
cd
..
cd
mpc*
mkdir
build &&
cd
build
..
/configure
--build=x86_64-linux-gnu --prefix=
/usr/gcc_4_7
--with-gmp=
/usr/gcc_4_7
--with-mpfr=
/usr/gcc_4_7
make
sudo
make
install
|
====================================================================================
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-5.4.0/configure --prefix=/home/ren/program/gcc-dst --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-gmp=/usr/gcc_4_8 --with-mpfr=/usr/gcc_4_8 --with-mpc=/usr/gcc_4_8
6. 编译
命令:
- $ make
晚上每个人编译的错误情况都不相同,我就将我所遇到的错误及解决办法帖出来,供大家参考。
我遇到的问题类似,这几个问题很有参考价值
问题:
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, 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
我的命令:
cd /usr/bin
ln -s /home/ren/program/gcc-dst/bin/gcc gcc_my5_4
ln -s /home/ren/program/gcc-dst/bin/g++ g++_my5_4
9. 测试
使用gcc_my5_4 -v检查版本、路径、配置信息等。
以下为配置时所用到的命令记录
==============================================
../gcc-4.0.2/configure --prefix=/usr/local/gcc-4.0.2 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++
../gcc-4.0.2/configure --prefix=/usr/local/gcc-4.0.2 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
../gcc-4.8.5/configure --prefix=/usr/local/gcc-4.8.5 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
../gcc-2.95.3/configure --prefix=/usr/local/gcc-2.95.3 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
../gcc-3.4.0/configure --prefix=/usr/local/gcc--3.4.0 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
../gcc-5.4.0/configure --prefix=/home/ren/program/gcc-dst --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++ --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-gmp=/usr/gcc_4_8 --with-mpfr=/usr/gcc_4_8 --with-mpc=/usr/gcc_4_8
../configure --prefix=/home/ren/program/gcc-dst --build=x86_64-linux-gnu
cd ..
cd ..
cd mpfr*
mkdir build && cd build
../configure --build=x86_64-linux-gnu --prefix=/home/ren/program/gcc-dst --with-gmp=/usr/gcc_4_7
make
sudo make install
ln -s /home/ren/program/gcc-dst/bin/gcc gcc_my5_4
ln -s /home/ren/program/gcc-dst/bin/g++ g++_my5_4