问题描述
离线安装Nginx在make时开始报错,通过日志定位找到可能是因为在我的系统上,编译器无法找到strerrordesc_np函数的声明。最后通过修改 src/os/unix/ngx_errno.c 文件,将 strerrordesc_np 替换为 strerror成功解决。`
[root@Server-nginx-1.27.2]# make
make -f objs/Makefile
make[1]: 进入目录“/shujupan/nginx-1.27.2”
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/event/quic -I src/os/unix -I /usr -I objs \
-o objs/src/os/unix/ngx_errno.o \
src/os/unix/ngx_errno.c
src/os/unix/ngx_errno.c: 在函数‘ngx_strerror’中:
src/os/unix/ngx_errno.c:30:5: 错误:隐式声明函数‘strerrordesc_np’ [-Werror=implicit-function-declaration]
msg = strerrordesc_np(err);
^
src/os/unix/ngx_errno.c:30:9: 错误:赋值时将整数赋给指针,未作类型转换 [-Werror]
msg = strerrordesc_np(err);
^
cc1: all warnings being treated as errors
make[1]: *** [objs/Makefile:682:objs/src/os/unix/ngx_errno.o] 错误 1
make[1]: 离开目录“/shujupan/nginx-1.27.2”
make: *** [Makefile:10:build] 错误 2
原因分析:
strerrordesc_np
是一个特定于某些操作系统(如 BSD 或一些 Linux 发行版)的函数,通常用于获取错误码的描述信息。在我的系统上,编译器无法找到该函数的声明
,这可能是因为缺少必要的头文件
或者你当前的操作系统不提供这个函数
。
赋值时将整数赋给指针,未作类型转换:由于 strerrordesc_np
返回的是一个指针类型的值
,而编译器报错表明可能没有找到该函数的声明
,所以这部分赋值导致类型不匹配错误
。
解决方案:
strerrordesc_np
是在某些系统中用于错误描述的函数,并不是所有系统都支持。我的修改如下:
修改源代码:在ngx_errno.c
文件中,找到调用 strerrordesc_np 的地方
,并将其替换为通用的 strerror 函数
。通常,strerror 是一个跨平台的替代函数,能够返回错误码的描述
。
编辑 src/os/unix/ngx_errno.c 文件的第30行
vim src/os/unix/ngx_errno.c
可以将strerrordesc_np其替换为strerror:
//替换前:
msg = strerrordesc_np(err);
//替换后:
msg = strerror(err);
总结:解决问题时候需要通过查看报错日志提示进行问题分析。