Linux 服务器上 gcc 编译器的升级
不知道大家有没有遇到我一样的问题,新版本的 steam 需要 glibc 2.3.2 库支持,许多老的 Linux 系统都不到这个版本,所以需要更新 glibc,但是更新运行库会造成系统原有许多程序无法运行,更可能是灾难性无法启动,所以如何才能升级乃?我想了一下应该有解决的办法,所以我陆续发一些关于如何更新的帖子。首先需要更新的是 GCC 编译器,glibc 新版本要求 GCC 至少是 3.2 或更高。
安装之前,系统中必须要有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网站上(http://gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。目前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}目录。
后记:
前两天刚安装好了GCC 3.4.0,把安装规划、安装过程、一些注意事项记录下来就形成了这篇文章。希望对大家、特别是还没有安装过GCC的朋友在安装GCC的时候有所帮助。
回复: Linux 服务器上 gcc 编译器的升级
我用debian,直接apt就可以升级,哈,这点很方便回复: Linux 服务器上 gcc 编译器的升级
Post by 红色彗星我用debian,直接apt就可以升级,哈,这点很方便
是啊 debian 的 APT 方便,可是我是 redhat 7.3 的
REDHAT 早就停止了对老版本的更新,非官方维护组的更新也不行只有手工了麻烦啊!
Linux 服务器上安装 Glibc-2.3.2
上一篇帖子主要是说如何更新 GCC 的,更新完 GCC 后就要升级 GLIBC 了,下面的内容是关于如何更新 GLIBC 的,但是大家千万不要直接按照下面的内容去更新这样会把原系统里的库都升级了,造成很多原系统中编译的软件无法执行,最好的办法是将新的 GLIBC 安装到类似 /usr/glibc3.2.3 这样的目录中去,然后启动 HLDS 的时候设置一下调用库文件的环境变量,这样即可以保留老的库不动,同时又可以让 STEAM 可以运行。Glibc的编译系统很自给自足,即使我们的编译器specs文件和连接器还指向/tools目录,也能完美安装。我们在安装Glibc前不能调整specs文件和连接器,因为glibc的autoconf测试会产生假结果,从而影响我们创建一个干净系统的目标。
注: 本节的Glibc测试套件很重要。我们建议在任何情况下都别省略这一步。
在安装glibc前,你必须用 cd 命令进入 glibc-2.3.2 目录然后解压 glibc-linuxthreads 压缩包,别把 glibc-linuxthreads 解压到通常的 /usr/src 目录下了。
如果你把这个包缺省的优化参数(包括 -march 和 -mcpu参数)改变的话,它会有很不良的表现。最好不要优化这个包。因此,如果你定义了任何优化参数的话,比如CFLAGS 和 CXXFLAGS,我们劝你在编译Glibc时unset或修改它们。
运用我们前面用过的那个补丁:
patch -Np1 -i ../glibc-2.3.2-sscanf-1.patchGlibc 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
mkdir ../glibc-buildcd ../glibc-build为编译 Glibc 做准备:
../glibc-2.3.2/configure --prefix=/usr \ --disable-profile --enable-add-ons \ --libexecdir=/usr/lib --with-headers=/usr/include新的配置参数意思是:
[*]--libexecdir=/usr/lib: 把 pt_chown 程序的位置从缺省的 /usr/libexec 改到 /usr/lib. 使用 libexec 目录是不遵守 FHS 的,因为 FHS 提都没提这个目录。
[*]--with-headers=/usr/include: 确保本次编译使用 /usr/include 里的内核头文件。如果你不指定这个参数,可能会用到/tools/include里的头文件,就不太完美了(尽管它们其实是一样的)。用这个参数还有个好处,如果你忘了在 /usr/include 目录下安装内核头文件,马上就能知道。
编译软件包:
make运行测试套件:
make checkthe 节 called 安装 Glibc-2.3.2 在 第 5 章里的测试套件说明这里也同样适用,有疑问的话,就参考一下前面的内容。
在安装Glibc的过程中,它会警告缺少/etc/ld.so.conf文件。其实这没什么关系,不过下面的命令能修正它:
touch /etc/ld.so.conf安装软件包:
make install上面的命令没有安装 locale ( Glibc 用它来使你的 Linux 系统能用另一种语言反馈信息),所以用下面的命令来安装它们:
make localedata/install-locales如果你不想用上面的命令来安装 locale,你可以只安装你所需要的locale。使用命令localedef,这方面的信息在glibc-2.3.2代码树的INSTALL文件中有详细叙述。然而,有几个locale对于运行其他软件包的测试套件是很重要的,比如GCC中的libstdc++,下面的命令能安装运行测试套件所必需的最少locale:
mkdir -p /usr/lib/localelocaledef -i de_DE -f ISO-8859-1 de_DElocaledef -i de_DE@euro -f ISO-8859-15 de_DE@eurolocaledef -i en_HK -f ISO-8859-1 en_HKlocaledef -i en_PH -f ISO-8859-1 en_PHlocaledef -i en_US -f ISO-8859-1 en_USlocaledef -i es_MX -f ISO-8859-1 es_MXlocaledef -i fr_FR -f ISO-8859-1 fr_FRlocaledef -i fr_FR@euro -f ISO-8859-15 fr_FR@eurolocaledef -i it_IT -f ISO-8859-1 it_ITlocaledef -i ja_JP -f EUC-JP ja_JP编译 linuxthreads man 手册页:
make -C ../glibc-2.3.2/linuxthreads/man最后安装这些 man 手册页:
make -C ../glibc-2.3.2/linuxthreads/man install
配置 Glibc
我们需要建立 /etc/nsswitch.conf 文件。虽然如果这个文件丢失或者不正确,glibc会使用默认的配置,但是其默认的配置无法很好地在网络环境下工作(那是我们下一章的问题)。同时我们也需要设置自己的时区。
使用如下命令建立新的 /etc/nsswitch.conf 文件:
cat > /etc/nsswitch.conf << "EOF"# Begin /etc/nsswitch.confpasswd: filesgroup: filesshadow: filespublickey: fileshosts: files dnsnetworks: filesprotocols: db filesservices: db filesethers: db filesrpc: db filesnetgroup: db files# End /etc/nsswitch.confEOF你可以使用 tzselect 脚本选择时区:
tzselect按照顺序回答脚本运行过程中提出的问题,脚本运行完毕,就会给出所需时区文件的位置。比如 EST5EDT或Canada/Eastern. 然后再用下列命令来创建 /etc/localtime 文件:
cp --remove-destination /usr/share/zoneinfo/Canada/Eastern /etc/localtime参数的意思:
[*]--remove-destination: 在删除已存在的符号链接时,需要这个参数。我们拷贝文件而不是创建符号链接的原因是,有可能 /usr在单独的分区上,如果启动进入单用户模式时,就有麻烦了。
当然,别盲目地填 Canada/Eastern, 应该填入你所在的时区名称,就是上面的 tzselect 脚本告诉你的那个。
配置动态链接库加载程序
在默认情况下,动态链接库加载程序(/lib/ld-linux.so.2)会自动搜索/lib和/usr/lib 目录。然而,如果有些库不是放在这两个目录中,你就需要把它们的路径加到 /etc/ld.so.conf 里,这样动态链接库加载程序才能找到它们。有两个目录是包含库文件但又不在默认目录中的,是 /usr/local/lib 和/opt/lib,我们要把它们加到动态链接库加载程序的搜索路径中。
使用如下命令建立新的 /etc/ld.so.conf 文件:
cat > /etc/ld.so.conf << "EOF"# Begin /etc/ld.so.conf/usr/local/lib/opt/lib# End /etc/ld.so.confEOF
页:
[1]