0.以下在系统CentOS 6.3 x86_64上操作
1.试图运行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的:
- [ghui@StuOS bin]$ pwd
- /var/VMdisks/cross/mingw32/bin
- [ghui@StuOS bin]$ ls
- lrelease QtCore4.dll QtNetwork4.dll QtSql4.dll QtXml4.dll
- moc QtDeclarative4.dll QtOpenGL4.dll QtSvg4.dll rcc
- phonon4.dll QtGui4.dll QtScript4.dll QtTest4.dll uic
- qmake QtMultimedia4.dll QtScriptTools4.dll QtWebKit4.dll
- [ghui@StuOS bin]$ ./qmake
- ./qmake: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./qmake)
2.查看系统glibc支持的版本:
- [ghui@StuOS bin]$ strings /lib64/libc.so.6 |grep GLIBC_
- GLIBC_2.2.5
- GLIBC_2.2.6
- GLIBC_2.3
- GLIBC_2.3.2
- GLIBC_2.3.3
- GLIBC_2.3.4
- GLIBC_2.4
- GLIBC_2.5
- GLIBC_2.6
- GLIBC_2.7
- GLIBC_2.8
- GLIBC_2.9
- GLIBC_2.10
- GLIBC_2.11
- GLIBC_2.12
- GLIBC_PRIVATE
- [ghui@StuOS bin]$ rpm -qa |grep glibc
- glibc-static-2.12-1.80.el6_3.6.x86_64
- glibc-headers-2.12-1.80.el6_3.6.x86_64
- glibc-common-2.12-1.80.el6_3.6.x86_64
- glibc-devel-2.12-1.80.el6_3.6.x86_64
- glibc-static-2.12-1.80.el6_3.6.i686
- glibc-devel-2.12-1.80.el6_3.6.i686
- glibc-2.12-1.80.el6_3.6.i686
- glibc-2.12-1.80.el6_3.6.x86_64
3.可以看到最高只支持2.12版本,所以考虑编译解决这个问题:
a. 到http://www.gnu.org/software/libc/下载最新版本,我这里下载了glibc-2.14.tar.xz 这个版本,解压到任意目录准备编译
b.这里解压到/var/VMdisks/glibc-2.14/
- [ghui@StuOS bin]$ cd /var/VMdisks/glibc-2.14/
- [ghui@StuOS glibc-2.14]$ pwd
- /var/VMdisks/glibc-2.14
- [ghui@StuOS glibc-2.14]$ ls
- abilist config.h.in intl README.libm
- abi-tags config.log io resolv
- aclocal.m4 config.make.in libc-abis resource
- aout configure libidn rt
- argp configure.in libio Rules
- assert conform LICENSES scripts
- autom4te.cache CONFORMANCE locale setjmp
- bits COPYING localedata shadow
- BUGS COPYING.LIB login shlib-versions
- build cppflags-iterator.mk mach signal
- CANCEL-FCT-WAIVE crypt Makeconfig socket
- CANCEL-FILE-WAIVE csu Makefile soft-fp
- catgets ctype Makefile.in stdio-common
- ChangeLog debug Makerules stdlib
- ChangeLog.1 dirent malloc streams
- ChangeLog.10 dlfcn manual string
- ChangeLog.11 elf math sunrpc
- ChangeLog.12 extra-lib.mk misc sysdeps
- ChangeLog.13 extra-modules.mk NAMESPACE sysvipc
- ChangeLog.14 FAQ NEWS termios
- ChangeLog.15 FAQ.in nis test-skeleton.c
- ChangeLog.16 gmon NOTES time
- ChangeLog.17 gnulib nptl timezone
- ChangeLog.2 grp nptl_db tls.make.c
- ChangeLog.3 gshadow nscd version.h
- ChangeLog.4 hesiod nss Versions.def
- ChangeLog.5 hurd o-iterator.mk wcsmbs
- ChangeLog.6 iconv po wctype
- ChangeLog.7 iconvdata posix WUR-REPORT
- ChangeLog.8 include PROJECTS
- ChangeLog.9 inet pwd
- conf INSTALL README
c.在glibc源码目录建立构建目录,并cd进入构建目录
- [ghui@StuOS glibc-2.14]$ mkdir build
- [ghui@StuOS glibc-2.14]$ cd build
d.运行configure配置,make && sudo make install
- [ghui@StuOS build]$ ../configure --prefix=/opt/glibc-2.14
- [ghui@StuOS build]$ make -j4
- [ghui@StuOS build]$ sudo make install
- [sudo] password for ghui:
4.临时修改环境变量
- [ghui@StuOS bin]$ export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH
- [ghui@StuOS glibc-2.14]$ cd /var/VMdisks/cross/mingw32/bin/
- [ghui@StuOS bin]$ ./qmake
- Usage: ./qmake [mode] [options] [files]
- QMake has two modes, one mode for generating project files based on
- some heuristics, and the other for generating makefiles. Normally you
- shouldn't need to specify a mode, as makefile generation is the default
- mode for qmake, but you may use this to test qmake on an existing project
- ...
此时运行正常,问题解决。
由于其他软件需要更高级的glibc 所以升级如下:
首先用centos的yum升级glibc库
-
yum update glibc
但问题依旧。用命令查看glibc库的信息
-
rpm -qi glibc
显示系统的glibc库版本为2.5
在CentOS中用更新命令到2.5已经是最新版本了,只好手动下载 glibc 2.11的源码包编译安装更新:
地址:http://ftp.gnu.org/pub/gnu/glibc/glibc-2.11.tar.gz
-
cd /usr/src
-
mkdir glibc-2.11-build
-
wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.11.tar.gz
-
tar zxvf glibc-2.11.tar.gz
-
cd /usr/src/glibc-2.11-build/
-
export CFLAGS="-g -O2 -march=i686"
-
/usr/src/glibc-2.11/configure --prefix=/usr/src/glibc-2.11-build/ --with-headers=/usr/include
-
make
-
make install
注意:
1. 在目录usr/src/glibc-2.11执行configure命令时不能执行,需在外部文件夹glibc-2.11-build 执行
2. 加上优化开关,export CFLAGS="-g -O2 -march=i686",否则会出现错误,此处的i686请参照自己的机器
3. 当有如下错误时:
checking whether ranlib is necessary... no
checking LD_LIBRARY_PATH variable... contains current directory
configure: error:
*** LD_LIBRARY_PATH shouldn't contain the current directory when
*** building glibc. Please change the environment variable
*** and run configure again.
解决办法:查看LD_LIBRARY_PATH echo $LD_LIBRARY_PATH,我的打印的是/usr/lib/qt44/lib:
configure里说:LD_LIBRARY_PATH不能以终结符作为开始和最后一个字符,不能有2个终结符连在一起,所以修改下LD_LIBRARY_PATH即可,export LD_LIBRARY_PATH=/usr/lib/qt44/lib
4. 当有如下错误时:
configure: error: gcc must provide the header
解决办法:get the cpuid.h file from official GCC respositories> (http://gcc.gnu.org/viewcvs/tags/gcc_4_4_2_release/gcc/config/i386/cpuid.h?view=co)> and put it into /usr/include(上面指定的--with-headers)
5. 当以上问题都解决时,make make install吧,由于东西比较多,需要些时间,大概半小时左右。
LD_LIBRARY_PATH shouldn't contain the current directory
I am trying to build a self-contain GLIBC 2.7. It shows following error when I runconfigure
checking whether ranlib is necessary... no
checking LD_LIBRARY_PATH variable... contains current directory
configure: error:
*** LD_LIBRARY_PATH shouldn't contain the current directory when
*** building glibc. Please change the environment variable
*** and run configure again.
my LD_LIBRARY_PATH is
$ echo $LD_LIBRARY_PATH
/home/sliu/opt/lib:/home/sliu/opt/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1:/home/sliu/opt/lib64:/home/sliu/opt/lib64/gcj-4.8.1-14:
The error message complains that LD_LIBRARY_PATH contain the current directory. However my LD_LIBRARY_PATH doesn't contain any "current directory". Actually, it's caused by the path seperate character ":" instead of "current directory". If you search LD_LIBRARY_PATH in configure
, you will find this comments
# Test if LD_LIBRARY_PATH contains the notation for the current directory
# since this would lead to problems installing/building glibc.
# LD_LIBRARY_PATH contains the current directory if one of the following
# is true:
# - one of the terminals (":" and ";") is the first or last sign
# - two terminals occur directly after each other
# - the path contains an element with a dot in it
Which means, The LD_LIBRARY_PATH can not start or end with character ":".
So this issue can be fixed by removing the last ':' character in LD_LIBRARY_PATH.
解决办法就是,去掉 LD_LIBRARY_PATH 最后的那个路径分隔符':'.