ubuntu 20.04 编译安装 tengine 2.2.3 报错 all warnings being treated as errors
前言: 由于项目里头用到了tengine,但是自己对tengine的启动,反向代理的配置,端口代理,负载均衡等这些属性配置等都不了解,这段时间就来补补这方面的课,学习一项技术的最快方法就是跟着官方文档编译--安装--配置来一遍,这样能够对项目结构,模块组成有一个起码的了解,安装完成后剩下的就是按照官方文档解释把常用配置试验与实践啦,接下来再结合项目中的一些配置理解实际用途.
1.首先编译环境介绍 这次编译安装我下载的版本是 tengine 2.2.3, make 编译器版本为 GNU Make 4.2.1,ssl模块版本是:openssl-1.0.0
2.具体出错截图
3.错误解决过程
首先在google上搜到了一位前辈在编译其他项目时也遇到了类似的错:前辈遇到的编译报错
综合问题回答来看:大概意思是说在高版本的GCC编译器认为开发人员可能没有意识到警告可能导致的后果,于是就在编译选项中加入了:Werror 该选项的默认值是将警告也当作错误处理以提醒开发人员.要解决此编译警告报错只需要在执行make命令时加入额外参数CFLAGS即可 :
make CFLAGS='-Wno-implicit-fallthrough'
参考连接:
CSDN 前辈的错误经验
GCC项目组的官方ISSUE解答
本来解决到这里本来以为已经问题结束了,可是谁知道后面的过程中又出现了新的问题
-_-!
新错误截图如下:
根据错误描述在编译src/os/unix/ngx_user.c文件输出objs/src/os/unix/ngx_user.o文件时出的错:好吧我们去看看源文件里头是啥(这里只截取到了前50行内容,感兴趣的同学可以私下里看看完整内容)
#ifdef __GLIBC__
/* work around the glibc bug ,奇怪的地方在这里,源码里头貌似标明了这个地方在glibc
环境下会出现bug,我们注释掉这一行再编译试试*/
cd.current_salt[0] = ~salt[0];
#endif
value = crypt_r((char *) key, (char *) salt, &cd);
if (value) {
len = ngx_strlen(value) + 1;
*encrypted = ngx_pnalloc(pool, len);
if (*encrypted == NULL) {
return NGX_ERROR;
}
ngx_memcpy(*encrypted, value, len);
return NGX_OK;
}
ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed");
return NGX_ERROR;
}
改完源文件后我们继续执行
make CFLAGS='-Wno-implicit-fallthrough' && make install
顺利执行完成后会在终端中看到类似以下的输出就编译安装完成了:),生成的可执行文件默认存放在/usr/local/nginx 目录下.
make[1]: 离开目录“/opt/soft/tengine-2.2.3”
make -f objs/Makefile manpage
make[1]: 进入目录“/opt/soft/tengine-2.2.3”
sed -e "s|%%PREFIX%%|/usr/local/nginx|" \
-e "s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|" \
-e "s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|" \
-e "s|%%ERROR_LOG_PATH%%|/usr/local/nginx/logs/error.log|" \
< man/nginx.8 > objs/nginx.8
make[1]: 离开目录“/opt/soft/tengine-2.2.3”
以上解决办法参考至:未定义解决办法
至此,此次的编译安装之旅就告一段落啦!
小提醒:
此次我使用的tengine 版本是2.2.3,电脑中的openssl版本是1.0.0 ,在2.2.2版本中若是使用openssl1.1.0模块进行编译会报其他指针引用类型的错误,这是tengine2.2.2 版本与高版本的openssl 不兼容导致的.在此给各位小伙伴提个醒,使用时一定要注意版本哦.issue描述详情请参见issue#1066问题描述 .