明天实验为:Linux GNU 开发环境建立实验。主要是搭建gcc编译器,在此总结一下搭建过程中遇到的问题和搭建的基本步骤,以免。下面主要的内容来自老师给的《实验说明》,错误通过网络查阅解决。下面的内容中红色为错误内容及其解决方法,蓝色为我成功执行的命令(与实验说明相同的部分不用蓝色标出)。
我们本次实验的内容是下载编译 gcc4.1.1,并且练习由源码编译软件的方法,掌握 gcc
编译器的建立过程。最后验证 gcc4.1.1 是否建立成功。
编译 gcc4.1.1 的详细步骤如下:
1.下载
从 GCC 的 网 站 ( http://ftp.gnu.org/gnu/gcc/gcc-4.1.1/ ) 下 载 文 件
gcc-4.1.1.tar.bz2。本文件的大小是 37.4M,注意别下错了。
2.解压缩
用命令tar -xjvf gcc-4.1.1.tar. bz2解压下载文件,解压结束后新生的gcc-4.1.1目录
被称为源目录(用${srcdir}表示)。${srcdir}/INSTALL目录下有GCC安装步骤的详细说明,
我们可用浏览器打开index.html仔细阅读。
3.建立目标目录
目标目录(我们在此也称${objdir})与源目录${srcdir}是同级目录,用来存放编译结
果,例如我们建立一个叫gcc-obj的目标目录:
mkdir gcc-obj
cd gcc-obj
以下的操作主要是在目标目录${objdir}下进行。
4.配置
该过程是在目标目录${objdir}下进行,配置的目的是决定将GCC编译器安装到什么地方
(我们在此称其${desdir}),支持什么语言以及指定其它一些选项等。注意:${desdir}
不能与${objdir}或${srcdir}目录相同。配置时通过执行${srcdir}下的configure来完成
的,例如下面的命令:
../gcc-4.1.1/configure --prefix=/usr/local/gcc-4.1.1 --
enable-threads --disable-checking --enable--long-long --
host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
记得在使用上面的命令是用你的真实路径替换${desdir},并且注意格式,哪有空格,哪
没有。上面的命令是将GCC安装在/usr/local/gcc-4.1.1目录下,支持C/C++和JAVA语言,其
它选项参见GCC提供的帮助说明。可以选择不支持java语言,这样能够大量节省编译时间。
在执行上面的命令时遇到的错误有:
这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。
注:若你用的gcc版本较高的话,可能会出现以下错误:
WARNING: `makeinfo' ismissing on your system. Youshould only need it if
you modifieda `.texi' or `.texinfo' file, or any other file
indirectlyaffecting the aspect of themanual. The spurious
call mightalso be the consequence of using a buggy `make' (AIX,
DU,IRIX). You might want to installthe `Texinfo' package or
the `GNUmake' package. Grab either fromany GNU archive site.
make[4]: *** [fastjar.info] 错误1
make[4]: Leaving directory `/usr/src/gcc-4.1.1-build/fastjar'
make[3]: *** [all] 错误 2
make[3]: Leaving directory `/usr/src/gcc-4.1.1-build/fastjar'
make[2]: *** [all-fastjar] 错误 2
make[2]: Leaving directory `/usr/src/gcc-4.1.1-build'
make[1]: *** [all] 错误2
make[1]: Leaving directory `/usr/src/gcc-4.1.1-build'
make: *** [bootstrap] 错误2
出现此错误的原因是在configure文件中texinfo对该版本不支持可以在configure里找到
以下语句
if ${MAKEINFO} --version"
| egrep 'texinfo[^0-9]*([1-3][0-9]|4".[4-9]|[5-9])'>/dev/null 2>&1;then
然后将它改为
'texinfo[^0-9]*([1-3][0-9]|4\.[4-9]|4\.[1-9][0-9]*|[5-9])'
改完后执行make命令又遇到以下问题:
http://www.cnblogs.com/gcc-4.1.1/gcc/java/jcf-io.c:225: warning: implicit declaration of function ‘inflateInit2’
http://www.cnblogs.com/gcc-4.1.1/gcc/java/jcf-io.c:225: error: ‘MAX_WBITS’ undeclared (first use in this function)
http://www.cnblogs.com/gcc-4.1.1/gcc/java/jcf-io.c:226: warning: implicit declaration of function ‘inflate’
http://www.cnblogs.com/gcc-4.1.1/gcc/java/jcf-io.c:226: error: ‘Z_NO_FLUSH’ undeclared (first use in this function)
http://www.cnblogs.com/gcc-4.1.1/gcc/java/jcf-io.c:227: warning: implicit declaration of function ‘inflateEnd’
make[2]: *** [java/jcf-io.o] 错误 1
make[2]:正在离开目录 `/home/wangwei/share/tmp/gcc-obj/gcc'
make[1]: *** [all-gcc] 错误 2
make[1]:正在离开目录 `/home/wangwei/share/tmp/gcc-obj'
make: *** [all] 错误 2
原因很简单是因为--with-system-zlib,当然要你装好 zlib ,特别是 zlib的开发包了,一般是 zlib-devel,删除该条即可。
将GCC安装在/usr/local/gcc-3.4.0目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。
我的操作系统为ubuntu9.10 真正执行成功所用的命令为:
sudo ../gcc-4.1.1/configure --prefix=/home/wang/share/tmp/gcc-install/ --enable-threads --disable-checking --enable--long-long --host=i486-linux-gnu --enable-language=c,c++,java
注意:我的${srcdir}为/home/wang/share/tmp/gcc-4.1.1; ${objdir}为/home/wang/share/tmp/gcc-obj ;${desdir}为/home/wang/share/tmp/gcc-install/ ; 其中原来的--host=i386-redhat-linux(好像不写也可以但没试过)因为我的版本为i486-linux-gnu故改掉,可以通过gcc -v来查看你的机器是什么版本的。删掉-with-system-zlib。 以上是我成功时所执行的命令,也有人什么也没改成功的。
5.编译
make
这是一个漫长的过程。在P4-1.6的机器上,这个过程大概用了50分钟。
6.安装
make install
执行上面的命令将编译好的库文件等拷贝到${desdir}目录中 (根据自己设定的路径, 可
能需要管理员的权限)。至此,漫长的GCC-4.1.1安装过程就完成了。
7.设置
GCC-4.1.1的所有文件,包括命令文件(如gcc、g++)、库文件等都在${desdir}目录下
存放,如命令文件放在bin目录下、库文件在lib下、头文件在include下等。由于命令文件
和库文件所在的目录还没有包含在相应的搜索路径内, 所以必须要作适当的设置之后编译器
才能顺利地找到并使用它们。
首先是gcc、g++、gcj的设置,要想使用GCC-4.1.1的gcc等命令,简单的方法就是把它的
路径${desdir}/bin放在环境变量PATH中。我们也可以用另外一种符号连接的方式实现,这
样做的好处是我们仍然可以使用系统上原来的旧版本的GCC的编译器。
我们先察看一下原来gcc所在的路径:
which gcc
如果是按照我们前面的试验过程安装成功的话,上述命令会显示:/usr/bin/gcc。我们
再执行以下命令:
cd /usr/bin
ln -s ${destdir}/bin/gcc gcc4
ln -s ${destdir}/bin/g++ g++4
ln -s ${destdir}/bin/gcj gcj4
这样,我们就可以分别使用gcc4、g++4、gcj4来调用GCC4.1.1的gcc、g++、gcj完成对C、
C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。
其次是库路径的设置,将${desdir}/lib路径添加到环境变量LD_LIBRARY _PATH中,最好
添加到系统的配置文件中,这样就不必每次都要设置这个环境变量了。
例如,如果GCC-4.1.1安装在/usr/local/gcc-4.1.1目录下,在RedHat Linux下可以直接
在命令行下执行或者在文件/etc/profile中添加下面一句话:
setenv LD_LIBRARY_PATH /usr/local/gcc-4.1.1/lib:$LD_LIBRARY_PATH
8.测试
安装了这么长时间, 终于迎来我们的第一道曙光, 我们终于可以享用自己的劳动成果了。
我们可以用新的编译命令(gcc4、g++4等)编译自己以前的C、C++程序,或在linux提示符
下键入gcc4 –v,看是否显示我们安装的GCC的版本号4.1.1,来检验我们新安装的GCC编译
器能否正常工作。如果显示如下,说明我们已经劳有所获了:
使用内建 specs。
目标:i386-redhat-linux
配置为:../gcc-4.1.1/configure --prefix=/usr/local/gcc-4.1.1 --enable-threads
--disable-checking --enable--long-long --host=i386-redhat-linux
--with-system-zlib --enable-language=c,c++,java
线程模型:posix
gcc 版本4.1.1
最后我们可以根据需要,删除或保留${objdir}和${srcdir}目录。
我机器的显示为:
使用内建 specs。
目标:i486-linux-gnu
配置为:../gcc-4.1.1/configure --prefix=/home/wangwei/share/tmp/gcc-install/ --enable-threads --disable-checking --enable--long-long --host=i486-linux-gnu --enable-language=c,c++,java
线程模型:posix
gcc 版本 4.1.1