当前位置:论坛首页 > Linux面板 > 求助

【奖励宝塔币300】编译安装Nginx 1.25时编译lua_cjson报错

发表在 Linux面板2024-2-21 14:53 [复制链接] 1 845

面板、插件版本:

宝塔面板 8.0.5,Nginx 1.25
系统版本:

Debian 12
问题描述:

编译安装 Nginx 1.25 时虽然宝塔面板没有报错,但我发现日志中有以下错误信息:
  1. cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/include/luajit-2.0 -fpic -o lua_cjson.o lua_cjson.c
  2. lua_cjson.c:43:10: fatal error: lua.h: No such file or directory
  3. 43 | #include <lua.h>
  4. | ^~~~~~~
  5. compilation terminated.
  6. make: *** [Makefile:89: lua_cjson.o] Error 1
  7. cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/include/luajit-2.0 -fpic -o lua_cjson.o lua_cjson.c
  8. lua_cjson.c:43:10: fatal error: lua.h: No such file or directory
  9. 43 | #include <lua.h>
  10. | ^~~~~~~
  11. compilation terminated.
  12. make: *** [Makefile:89: lua_cjson.o] Error 1
复制代码
这些错误信息应该是编译 lua_cjson 的时候找不到 luajit-2.0 目录,我看了一下 https://download.bt.cn/install/0/nginx5.sh 的源码,脚本先安装 LuaJIT 2.1,然后在 Install_cjson() 函数中执行 make 命令编译安装 lua_cjson(第 172 行),但没有指定之前安装的 LuaJIT 2.1 所在目录,所以默认使用 /usr/local/include/luajit-2.0 目录从而导致报错。lua_cjson 源代码中的 Makefile 中是这样定义默认值的:
  1. ##### Build defaults #####
  2. LUA_VERSION =       5.3
  3. TARGET =            cjson.so
  4. PREFIX =            /usr/local
  5. #CFLAGS =            -g -Wall -pedantic -fno-inline
  6. CFLAGS =            -O3 -Wall -pedantic -DNDEBUG
  7. CJSON_CFLAGS =      -fpic
  8. CJSON_LDFLAGS =     -shared
  9. LUA_INCLUDE_DIR =   $(PREFIX)/include
  10. LUA_CMODULE_DIR =   $(PREFIX)/lib/lua/$(LUA_VERSION)
  11. LUA_MODULE_DIR =    $(PREFIX)/share/lua/$(LUA_VERSION)
  12. LUA_BIN_DIR =       $(PREFIX)/bin
复制代码
如果要使用脚本装好的 LuaJIT 2.1 编译,应该把安装脚本里的 make 命令换成这个命令:
  1. make LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 CJSON_LDFLAGS='-shared -lluajit-5.1' LUA_VERSION=5.1
复制代码
把安装脚本里的 make 命令改成这个命令后,虽然正确配置了 LuaJIT 的路径,不会报错找不到文件了,但会报另一种编译错误:
  1. cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include/luajit-2.1 -fpic -o lua_cjson.o lua_cjson.c
  2. lua_cjson.c:1298:13: error: static declaration of ‘luaL_setfuncs’ follows non-static declaration
  3. 1298 | static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
  4.       |             ^~~~~~~~~~~~~
  5. In file included from lua_cjson.c:44:
  6. /usr/local/include/luajit-2.1/lauxlib.h:88:18: note: previous declaration of ‘luaL_setfuncs’ with type ‘void(lua_State *, const luaL_Reg *, int)’
  7.    88 | LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
  8.       |                  ^~~~~~~~~~~~~
  9. In file included from lua_cjson.c:47:
  10. fpconv.h:15:20: warning: inline function ‘fpconv_init’ declared but never defined
  11.    15 | extern inline void fpconv_init();
  12.       |                    ^~~~~~~~~~~
  13. make: *** [Makefile:89: lua_cjson.o] Error 1
复制代码

我在 GitHub Issues 找到了相关的问题:https://github.com/JakobGreen/lua-requests/issues/24,大概是说 lua_cjson 的新版本 2.1.0.6 修复了这个问题,而脚本从  https://download.bt.cn/install/src/lua-cjson-2.1.0.tar.gz 下载的是旧版本。因此,应该把宝塔提供的 lua_cjson 源码换成修复了这个问题的最新版本,最新版本在这里下载:https://github.com/openresty/lua-cjson/releases. 经过测试,使用 lua_cjson 2.1.0.9 源码并在 make 命令中正确地指定编译参数就可以正常编译安装 lua_cjson 了。

最后总结一下我发现的两个问题:
1. nginx5.sh 脚本的第 172 行的编译命令没有正确指定编译参数,无法使用脚本安装好的 LuaJIT 2.1 来编译 lua_cjson,应该改成 make LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 CJSON_LDFLAGS='-shared -lluajit-5.1' LUA_VERSION=5.1
2. 添加编译参数后还会出现编译错误,因为宝塔提供的 lua_cjson 源码版本太旧了,还需要把 lua_cjson 源码换成最新版本才能正常安装。

完整的正确安装命令:
  1. wget -O lua-cjson-2.1.0.9.zip https://github.com/openresty/lua-cjson/archive/refs/tags/2.1.0.9.zip
  2. unzip lua-cjson-2.1.0.9.zip
  3. cd lua-cjson-2.1.0.9/
  4. make LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 CJSON_LDFLAGS='-shared -lluajit-5.1' LUA_VERSION=5.1
  5. cp cjson.so /usr/local/lib/lua/5.1/
复制代码



使用道具 举报 只看该作者 回复
发表于 2024-2-21 15:05:42 | 显示全部楼层
非常感谢您的反馈,为此特别奖励您宝塔币300个。
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

立即付费处理

工作时间:09:00至24:00

快速回复 返回顶部 返回列表