libmemcached编译安装报错解决记录
我负责的几个公司内部网站,仅集成了 php 原生 memcache 组件,不支持 memcached 分片存储的自动容灾方案,近期出现过几例因 memcache 服务器故障引起 WEB 爆卡的尴尬事,所以接到了一个给现网 php 集成 memcached 模块的需求。
内部的个别系统有多老、多难用我就不吐槽了,slackware、suse 用过的人都知道。。。不说了,总之老老实实的编译安装吧。
memcached 这个 php 模块依赖于 libmemcached,所以集成前先要编译安装 libmemcached。
按照常规编译方法,对 libmemcached 进行编译安装,结果如下报错:
error: cinttypes: No such file or directory
In file included from ./libmemcached/common.h:114,
from ./libmemcached/csl/common.h:50,
from libmemcached/csl/context.cc:38:
./libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
make[1]: *** [libmemcached/csl/libmemcached_libmemcached_la-context.lo] 错误 1
make[1]: Leaving directory `/usr/local/src/libmemcached-1.0.18'
make: *** [all] 错误 2
查了下资料,发现是因为 gcc 版本过低,看了下系统当前的 gcc 版本,是 4.1.2,决定升级之。
简单记录下 gcc 编译过程:
1、安装 gmp
wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2
tar xvf gmp-6.0.0a.tar.bz2
cd gmp-6.0.0
./configure --prefix=/usr/local/gmp
make -j4
make install
2、安装 mpfr
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2
tar xvf mpfr-3.1.3.tar.bz2
cd mpfr-3.1.3
./configure --with-gmp=/usr/local/
gmp --prefix=/usr/local/mpfr
make -j4
make install
4、安装 mpc
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
tar xvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --with-mpfr=/usr/local/mpfr
--with-gmp=/usr/local/gmp
--prefix=/usr/local/mpc
make -j4
make install
5、安装 gcc
对于这种老掉牙的服务器、程序,编译安装 gcc 的时候也不敢直接全局覆盖安装(编译不指定路径),于是将 gcc-4.5.1 安装到/usr/local/gcc-4.5.1
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.gz
tar xvf gcc-4.5.1.tar.gz
cd gcc-4.5.1
./configure --prefix=/usr/local/gcc-4.5.1
--with-mpc=/usr/local/mpc
--with-mpfr=/usr/local/mpfr
--with-gmp=/usr/local/gmp
# 根据CPU个数开启多线程编译,加快速度
make -j4
make install
Ps:更多可选参数请参考官方文档。gcc 编译安装必须注意依赖包的顺序,可谓环环相扣。
编译安装后,由于是指定的安装路径,所以系统用的依然是原来的 gcc,所以为了本次编译 libmemcached,需要将新版本软链过去,暂时使用(简单方案)
mv /usr/bin/gcc /usr/bin/gcc.old
ln -sf /usr/local/gcc-4.5.1/bin/gcc /usr/bin/gcc
进入 libmemcached 源码目录继续编译,结果如下报错:
error: bits/c++0x_warning.h: No such file or directory
error: cstdint: No such file or directory
error: tr1_impl/cinttypes: No such file or directory
In file included from ./libmemcached-1.0/memcached.h:46,
from ./libmemcached/common.h:114,
from ./libmemcached/csl/common.h:50,
from libmemcached/csl/context.cc:38:
/usr/local/gcc-4.5.1/include/c++/4.5.1/cinttypes:35:33: error: bits/c++0x_warning.h: No such file or directory
/usr/local/gcc-4.5.1/include/c++/4.5.1/cinttypes:42:19: error: cstdint: No such file or directory
/usr/local/gcc-4.5.1/include/c++/4.5.1/cinttypes:64:32: error: tr1_impl/cinttypes: No such file or directory
make[1]: *** [libmemcached/csl/libmemcached_libmemcached_la-context.lo] 错误 1
make[1]: Leaving directory `/usr/local/src/libmemcached-1.0.18'
make: *** [all] 错误 2
真是醉人,明明都升级了还报错!没办法,继续耐着性子看信息,发现 libmemcached 在 configure 之后有如下统计信息:
赫然发现了图中还有个 c++显示是 4.1.2 的老版本!!!于是,原来把 c++给漏了,顺手补之:
mv /usr/bin/c++ /usr/bin/c++.old
ln -sf /usr/local/gcc-4.5.1/bin/c++ /usr/bin/c++
再去编译安装,就行云流水,再无报错!后面编译 memcached 就不多说了,不会的可以参考前文教程。最后,记得取消 gcc 和 c++的软链接,还原到 4.1.2 版本即可(当然,若无异常也可以继续保留)。
- 新华三《中国城市数字经济指数白皮书》:深圳数字经济发展水平国内居首
- NodeMCU模块写入MicroPython固件
- 如何证明Application Domain的隔离性
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下]
- 我所理解的Remoting(1):Marshaling & Activation[上篇]
- oracle 12c 常见报告获取-AWR
- 人人公司收购美国卡车社区 Trucker Path,未来或探索无人驾驶
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]
- 《WCF的绑定模型》博文系列汇总[共6篇]
- 快来看看难民营里的高科技超市
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[中篇]
- 如何通过自定义MessageFilter的方式利用按键方式操作控件滚动条[附源代码]
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
- 《WCF技术剖析》博文系列汇总[持续更新中]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法