Redis 6.0.8 编译错误解决办法
问题
当你下载redis 最新版本6.0.8 的时候会发现make的时候会报错,简单来说就是最新版的redis用到了c11 ,你的系统gcc版本低了,系统自带gcc版本是4.8.5,只需要更新下gcc到5.4以上即可,同时编译redis时带上gcc版本的使用参数,不影响系统自带gcc!我这里安装最新版gcc10.2.0
cd src && make all
make[1]: 进入目录“/opt/src/redis-6.0.8/src”
^[[34mCC^[[0m ^[[33mMakefile.dep^[[0m
make[1]: Leaving directory “/opt/src/redis-6.0.8/src”
make[1]: 进入目录“/opt/src/redis-6.0.8/src”
^[[34mCC^[[0m ^[[33mserver.o^[[0m
In file included from server.c:30:0:
server.h:1065:5: error:expected specifier-qualifier-list before ‘_Atomic’
_Atomic unsigned int lruclock; /* Clock for LRU eviction */
^
server.c: in function ‘serverLogRaw’中:
server.c:1032:31: error:‘struct redisServer’ has no member named ‘logfile’
int log_to_stdout = server.logfile[0] == '\0';
^
server.c:1035:23: error:‘struct redisServer’ has no member named ‘verbosity’
if (level < server.verbosity) return;
^
server.c:1037:47: error:‘struct redisServer’ has no member named ‘logfile’
fp = log_to_stdout ? stdout : fopen(server.logfile,"a");
^
server.c:1050:47: error:‘struct redisServer’ has no member named ‘timezone’
nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
^
server.c:1050:63: error:‘struct redisServer’ has no member named ‘daylight_active’
nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
^
server.c:1053:19: error:‘struct redisServer’ has no member named ‘sentinel_mode’
if (server.sentinel_mode) {
......(后面有一长窜)
系统自带版本
[root@alert redis-6.0.8]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright © 2015 Free Software Foundation, Inc.
安装gcc
gcc 下载地址:gcc下载地址 http://mirror.hust.edu.cn/gnu/gcc/
新gcc编译安装也是需要依靠旧版本的gcc 想编译 C++11 标准下的 C++ 程序,则至少要安装 4.8 版本的 GCC 编译器,低版本的 GCC 编译器是不支持 C++11 标准的。
yum install -y glibc-static libstdc++-static
yum install -y gcc gcc-c++
手动安装GCC编译器
注意,此方式需要耗费的时间较长(几个小时),但支持安装指定版本的 GCC 编译器,并适用于大多数 Linux 发行版(不同之处会有额外提示);同时,如果想对已安装的 GCC 编译器进行升级,也可以使用此方式。
1.解压
tar -xf gcc-10.2.0.tar.gz -C /opt/src/
cd gcc-10.2.0
2.下载安装 GCC 所需要的依赖包(如 gmp、mpfr、mpc 等):
[root@alert gcc-10.2.0]# ./contrib/download_prerequisites
2020-09-11 16:37:01 URL:http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840/2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2020-09-11 16:37:16 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284/1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2020-09-11 16:37:28 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925/669925] -> "./mpc-1.0.3.tar.gz" [1]
2020-09-11 16:37:46 URL:http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291/1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 确定
mpfr-3.1.4.tar.bz2: 确定
mpc-1.0.3.tar.gz: 确定
isl-0.18.tar.bz2: 确定
All prerequisites downloaded successfully.
3.手动创建一个目录,用于存放编译 GCC 源码包生成的文件
mkdir gcc-build-10.2.0
cd gcc-build-10.2.0
pwd
/opt/src/gcc-10.2.0/gcc-build-10.2.0
#使用gcc目录下的命令编译安装
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/opt/app/gcc-10.2.0
–enable-languages 用于设定 GCC 编译器支持编译的编程语言的类别,例如 c、c++、java、objc、obj-c++、go 等,这里只安装c,c++
4.创建好 makefile 文件之后,接下来就可以使用 make 命令来编译 GCC 源程序
#耗时4小时,请规划好时间
make
make install
使用新的gcc编译redis
CC=/opt/app/gcc-10.2.0/bin/gcc make
make install PREFIX=/opt/app/redis6.0.8
使用yum更新gcc(可选)
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v
最后在 make && make install