宝塔面板 8.0.5,Nginx 1.25
Debian 12
编译安装 Nginx 1.25 时虽然宝塔面板没有报错,但我发现日志中有以下错误信息:
- cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/include/luajit-2.0 -fpic -o lua_cjson.o lua_cjson.c
- lua_cjson.c:43:10: fatal error: lua.h: No such file or directory
- 43 | #include <lua.h>
- | ^~~~~~~
- compilation terminated.
- make: *** [Makefile:89: lua_cjson.o] Error 1
- cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/include/luajit-2.0 -fpic -o lua_cjson.o lua_cjson.c
- lua_cjson.c:43:10: fatal error: lua.h: No such file or directory
- 43 | #include <lua.h>
- | ^~~~~~~
- compilation terminated.
- 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 中是这样定义默认值的:- ##### Build defaults #####
- LUA_VERSION = 5.3
- TARGET = cjson.so
- PREFIX = /usr/local
- #CFLAGS = -g -Wall -pedantic -fno-inline
- CFLAGS = -O3 -Wall -pedantic -DNDEBUG
- CJSON_CFLAGS = -fpic
- CJSON_LDFLAGS = -shared
- LUA_INCLUDE_DIR = $(PREFIX)/include
- LUA_CMODULE_DIR = $(PREFIX)/lib/lua/$(LUA_VERSION)
- LUA_MODULE_DIR = $(PREFIX)/share/lua/$(LUA_VERSION)
- LUA_BIN_DIR = $(PREFIX)/bin
复制代码 如果要使用脚本装好的 LuaJIT 2.1 编译,应该把安装脚本里的 make 命令换成这个命令:
- make LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 CJSON_LDFLAGS='-shared -lluajit-5.1' LUA_VERSION=5.1
复制代码 把安装脚本里的 make 命令改成这个命令后,虽然正确配置了 LuaJIT 的路径,不会报错找不到文件了,但会报另一种编译错误:
- cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/include/luajit-2.1 -fpic -o lua_cjson.o lua_cjson.c
- lua_cjson.c:1298:13: error: static declaration of ‘luaL_setfuncs’ follows non-static declaration
- 1298 | static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
- | ^~~~~~~~~~~~~
- In file included from lua_cjson.c:44:
- /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)’
- 88 | LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
- | ^~~~~~~~~~~~~
- In file included from lua_cjson.c:47:
- fpconv.h:15:20: warning: inline function ‘fpconv_init’ declared but never defined
- 15 | extern inline void fpconv_init();
- | ^~~~~~~~~~~
- 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 源码换成最新版本才能正常安装。
完整的正确安装命令:- wget -O lua-cjson-2.1.0.9.zip https://github.com/openresty/lua-cjson/archive/refs/tags/2.1.0.9.zip
- unzip lua-cjson-2.1.0.9.zip
- cd lua-cjson-2.1.0.9/
- make LUA_INCLUDE_DIR=/usr/local/include/luajit-2.1 CJSON_LDFLAGS='-shared -lluajit-5.1' LUA_VERSION=5.1
- cp cjson.so /usr/local/lib/lua/5.1/
复制代码
|
|