编译glibc(gcc)以及过程中遇到的一些错误
2017-10-26 10:16
721 查看
一定要按照configure ——> make ——> make install三步骤。
1、下载glibc,解压
原文中的glibc-ports是用来支持arm架构芯片的包,可以将包内文件移动到glibc-2.15/ports内编译安装,这里不再赘述
2、准备一个编译文件夹
3、配置configure
4、编译安装
顺便说一下,make的-j参数是个坑,虽然可以并行编译,但如果Makefile或依赖关系有问题,编译会出错。
5、检查软连接
编译成功后,glibc-2.15-build文件下会生成一个新的libc.so.6,这是一个软连接,而真实的lib文件是此目录下的libc.so。ll是ls -l的别名
查看库文件
可以看到2.12的旧库文件还在,多了2.15版本的库文件,而且软链接文件全部指向了2.15版本
查看glibc支持的版本
下面总结了一下编译glibc遇到的错误。
DLIBRARYPATH shouldn’t contain the current directory
出现这个错误的原因是由于环境变量的LDLIBRARYPATH中出现了当前目录,这对gcc编译来说是多余的。
解决方法:
或者
安装目录prefix没指定的错误:
出现这个错误的原因在于,如果没指定prefix,则系统把这个程序装在/usr/local目录下。但是,c标准库要求必须安装在与根文件系统相同的分区中,否则不能用。但是/usr这个挂载点可能处在外部的分区。
解决方法就是指定prefix到/usr,这时候configure程序会自动把必须的内容装在/lib下(这个目录肯定与根目录同分区),扩展内容再装到/usr/lib下。
有些安装方法是编译时候指定的目录不是/usr,而是通过建立软链指向新的libc-2.14.so版本,在此过程中需要删除原来连接,建立新的软连接,但是此处有一个大坑,就是当你删除libc.so.6之后会导致系统命令不可用,如下在测试机中演示的错误过程:
接下来当你建立新的软链接时候,会发现ln命令不能用了。
当出现上面的状况时候,可以使用以下方法解决(假设libc-2.14.so已经拷贝到/lib64/目录下):
当然如果升级失败,还可以使用下面命令还原至系统升级前的版本libc-2.12.so:
“LD_PRELOAD”是一个环境变量,定义在程序运行前优先加载的动态链接库,本处作用就是在执行后面的ln命令时,指定使用的glibc库,这样命令就可以正常使用了。
1、下载glibc,解压
原文中的glibc-ports是用来支持arm架构芯片的包,可以将包内文件移动到glibc-2.15/ports内编译安装,这里不再赘述
wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz tar -zxvf glibc-2.15.tar.gz
2、准备一个编译文件夹
mkdir glibc-2.15-build cd glibc-2.15-build
3、配置configure
../glibc-2.15/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
4、编译安装
make make install
顺便说一下,make的-j参数是个坑,虽然可以并行编译,但如果Makefile或依赖关系有问题,编译会出错。
5、检查软连接
编译成功后,glibc-2.15-build文件下会生成一个新的libc.so.6,这是一个软连接,而真实的lib文件是此目录下的libc.so。ll是ls -l的别名
ll libc.so.6
查看库文件
ll /lib64/libc*
可以看到2.12的旧库文件还在,多了2.15版本的库文件,而且软链接文件全部指向了2.15版本
查看glibc支持的版本
strings libc.so | grep GLIBC
下面总结了一下编译glibc遇到的错误。
DLIBRARYPATH shouldn’t contain the current directory
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.
出现这个错误的原因是由于环境变量的LDLIBRARYPATH中出现了当前目录,这对gcc编译来说是多余的。
解决方法:
export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/
或者
unset LD_LIBRARY_PATH
安装目录prefix没指定的错误:
*** On GNU/Linux systems the GNU C Library should not be installed into *** /usr/local since this might make your system totally unusable. *** We strongly advise to use a different prefix. For details read the FAQ. *** If you really mean to do this, run configure again using the extra *** parameter `--disable-sanity-checks'.
出现这个错误的原因在于,如果没指定prefix,则系统把这个程序装在/usr/local目录下。但是,c标准库要求必须安装在与根文件系统相同的分区中,否则不能用。但是/usr这个挂载点可能处在外部的分区。
解决方法就是指定prefix到/usr,这时候configure程序会自动把必须的内容装在/lib下(这个目录肯定与根目录同分区),扩展内容再装到/usr/lib下。
有些安装方法是编译时候指定的目录不是/usr,而是通过建立软链指向新的libc-2.14.so版本,在此过程中需要删除原来连接,建立新的软连接,但是此处有一个大坑,就是当你删除libc.so.6之后会导致系统命令不可用,如下在测试机中演示的错误过程:
rm -rf /lib64/libc.so.6
接下来当你建立新的软链接时候,会发现ln命令不能用了。
ln -s /lib64/libc-2.14.so /lib64/libc.so.6 ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
当出现上面的状况时候,可以使用以下方法解决(假设libc-2.14.so已经拷贝到/lib64/目录下):
LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.6
当然如果升级失败,还可以使用下面命令还原至系统升级前的版本libc-2.12.so:
LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6
“LD_PRELOAD”是一个环境变量,定义在程序运行前优先加载的动态链接库,本处作用就是在执行后面的ln命令时,指定使用的glibc库,这样命令就可以正常使用了。
相关文章推荐
- vivi以及内核编译过程以及其中遇到的一些问题
- gcc编译遇到的一些错误(随时补充)
- linux下GCC编译环境中二叉树遍历、C语言实现以及调试过程中段错误
- tensorflow 源码编译安装以及遇到的一些错误
- 在Ubuntu中编译、安装 gcc4.1.1 过程以及遇到的问题
- gcc3.4编译2.6.31 内核编译以及遇到的问题和错误
- gcc3.4编译2.6.31 内核编译 以及 遇到的问题和错误
- Android程序的反编译和防止反编译,以及操作过程中遇到的一些问题
- 编译过程中遇到的一些错误
- hadoop2.4.1源码在64位系统编译过程中遇到的几个错误及解决方法
- ssh开发过程中遇到的问题,以及一些解决办法
- VS2010编译以及使用GLUI过程中碰到的一些问题
- 编译过程中遇到的错误---没有包含的APK
- C语言gcc编译过程以及常用编译选项
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 编译过程中遇到的警告或错误
- Oracle数据泵(Data Dump)使用过程当中经常会遇到一些奇奇怪怪的错误案例
- Ionic Android编译打包过程中遇到的一些问题及解决方案(ionic cordova build android)
- JBPM安装过程中遇到的一些错误
- 整合activiti过程中遇到的一些错误