阅读lmathlib.c

1. 重要的结构 luaL_Reg

typedef struct luaL_Reg {
  const char *name;
  lua_CFunction func;
} luaL_Reg;
typedef int (*lua_CFunction) (lua_State *L);

可以用该结构做参数简单的来创建table

luaL_newlib(L, mathlib);

这样在栈顶创建了一个table,并且table各个域(主要是各种方法 c closure, 注意是没有upvalue)

math lib里面还添加了几个常量,赋值

  lua_pushnumber(L, PI);
  lua_setfield(L, -2, "pi");
  lua_pushnumber(L, (lua_Number)HUGE_VAL);
  lua_setfield(L, -2, "huge");
  lua_pushinteger(L, LUA_MAXINTEGER);
  lua_setfield(L, -2, "maxinteger");
  lua_pushinteger(L, LUA_MININTEGER);
  lua_setfield(L, -2, "mininteger");
放一个值到栈顶,然后设置给刚刚创建的这个table。


2. RANDOM 能够处理0-2个参数

lua_gettop()检测参数数量

luaL_checkinteger(L, 1); 这个函数用来检查栈上的参数是否是int值,并返回

                                      ; 这个顺序是从上到下(我的理解)

lua_pushinteger(L, (lua_Integer)r + low); 将结果放回栈里

return 1; 表示返回一个值,注意一定要将栈对齐。

static int math_random (lua_State *L) {
  lua_Integer low, up;
  double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));
  switch (lua_gettop(L)) {  /* check number of arguments */
    case 0: {  /* no arguments */
      lua_pushnumber(L, (lua_Number)r);  /* Number between 0 and 1 */
      return 1;
    }
    case 1: {  /* only upper limit */
      low = 1;
      up = luaL_checkinteger(L, 1);
      break;
    }
    case 2: {  /* lower and upper limits */
      low = luaL_checkinteger(L, 1);
      up = luaL_checkinteger(L, 2);
      break;
    }
    default: return luaL_error(L, "wrong number of arguments");
  }
  /* random integer in the interval [low, up] */
  luaL_argcheck(L, low <= up, 1, "interval is empty"); 
  luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,
                   "interval too large");
  r *= (double)(up - low) + 1.0;
  lua_pushinteger(L, (lua_Integer)r + low);
  return 1;
}


MAKE lua cd lua/src && make all CFLAGS="-Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 " MYLDFLAGS="" AR="ar rc" make[3]: 进入目录“/root/redis-7.0.12/redis-7.0.12/deps/lua/src” cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lapi.o lapi.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lcode.o lcode.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldebug.o ldebug.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldo.o ldo.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldump.o ldump.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lfunc.o lfunc.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lgc.o lgc.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o llex.o llex.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lmem.o lmem.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lobject.o lobject.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lopcodes.o lopcodes.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lparser.o lparser.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstate.o lstate.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstring.o lstring.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltable.o ltable.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltm.o ltm.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lundump.o lundump.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lvm.o lvm.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lzio.o lzio.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o strbuf.o strbuf.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o fpconv.o fpconv.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lauxlib.o lauxlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lbaselib.o lbaselib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldblib.o ldblib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o liolib.o liolib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lmathlib.o lmathlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o loslib.o loslib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltablib.o ltablib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstrlib.o lstrlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o loadlib.o loadlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o linit.o linit.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_cjson.o lua_cjson.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_struct.o lua_struct.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_cmsgpack.o lua_cmsgpack.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_bit.o lua_bit.c ar rc liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o strbuf.o fpconv.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o lua_cjson.o lua_struct.o lua_cmsgpack.o lua_bit.o # DLL needs all object files ranlib liblua.a cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua.o lua.c cc -o lua lua.o liblua.a -lm cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o luac.o luac.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o print.o print.c cc -o luac luac.o print.o liblua.a -lm make[3]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps/lua/src” MAKE hdr_histogram cd hdr_histogram && make make[3]: 进入目录“/root/redis-7.0.12/redis-7.0.12/deps/hdr_histogram” cc -std=c99 -Wall -Os -g -DHDR_MALLOC_INCLUDE=\"hdr_redis_malloc.h\" -c hdr_histogram.c ar rcs libhdrhistogram.a hdr_histogram.o make[3]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps/hdr_histogram” MAKE jemalloc cd jemalloc && ./configure --with-version=5.2.1-0-g0 --with-lg-quantum=3 --with-jemalloc-prefix=je_ CFLAGS="-std=gnu99 -Wall -pipe -g3 -O3 -funroll-loops " LDFLAGS="" /bin/sh: ./configure: 权限不够 make[2]: *** [jemalloc] 错误 126 make[2]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps” make[1]: [persist-settings] 错误 2 (忽略) CC adlist.o In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 #include <jemalloc/jemalloc.h> ^ 编译中断。 make[1]: *** [adlist.o] 错误 1 make[1]: 离开目录“/root/redis-7.0.12/redis-7.0.12/src” make: *** [all] 错误 2 [root@java20241201 redis-7.0.12]# ls -l src/mkreleasehdr.sh -rwxr-xr-x. 1 root root 735 9月 23 19:04 src/mkreleasehdr.sh
09-24
<think> 我们正在解决Redis 7.0.12编译过程中的两个问题: 1. `/bin/sh: ./configure: 权限不够` 2. `致命错误:jemalloc/jemalloc.h:没有那个文件或目录` ### 问题分析 1. **权限问题**:在编译过程中,当执行`./configure`脚本时,如果该脚本没有可执行权限,就会报告“权限不够”。这通常发生在从源码包中解压出来的文件权限不正确的情况下。 2. **jemalloc头文件缺失**:Redis默认使用jemalloc作为内存分配器,但如果系统中没有安装jemalloc开发包,或者jemalloc的头文件不在标准路径,编译时就会找不到头文件。 ### 解决方案 #### 步骤1:安装编译依赖 首先确保系统已安装必要的编译工具和库。以CentOS/RHEL为例: ```bash sudo yum groupinstall "Development Tools" sudo yum install -y jemalloc-devel ``` 对于Ubuntu/Debian系统: ```bash sudo apt update sudo apt install -y build-essential libjemalloc-dev ``` #### 步骤2:修复脚本权限 进入Redis源码目录,为所有必要的脚本添加可执行权限: ```bash cd redis-7.0.12 # 修复configure脚本权限 chmod +x configure # 修复src目录下关键脚本权限 chmod +x src/mkreleasehdr.sh # 修复deps/jemalloc目录下配置脚本权限 chmod +x deps/jemalloc/configure ``` #### 步骤3:强制使用jemalloc 如果系统已安装jemalloc但编译时仍找不到头文件,可以显式指定jemalloc路径: ```bash # 清除之前失败的编译结果 make distclean # 使用jemalloc进行编译(关键步骤) make MALLOC=jemalloc ``` #### 步骤4:验证jemalloc安装 检查jemalloc开发包是否安装成功: ```bash # 检查jemalloc头文件是否存在 ls /usr/include/jemalloc/jemalloc.h # 检查jemalloc库文件是否存在 ls /usr/lib*/libjemalloc.so ``` 如果以上文件不存在,可能需要重新安装jemalloc开发包。 ### 完整编译流程 ```bash # 1. 安装依赖 sudo yum install -y gcc make jemalloc-devel # 2. 进入源码目录 cd redis-7.0.12 # 3. 修复权限 chmod +x configure chmod +x deps/jemalloc/configure chmod +x src/mkreleasehdr.sh # 4. 编译安装 make MALLOC=jemalloc sudo make install ``` ### 技术要点说明 1. **权限修复** Redis源码包中的部分脚本默认没有可执行权限,需要手动添加[^1]。 2. **jemalloc强制指定** 使用`MALLOC=jemalloc`参数确保编译时链接正确的内存分配器[^3]。 3. **开发包依赖** jemalloc-devel(或libjemalloc-dev)提供编译所需的头文件和链接库。 ### 潜在问题排查 - **错误:`jemalloc.h: No such file or directory`** 解决方案: ```bash # 查找jemalloc.h位置 sudo find / -name jemalloc.h # 如果找到不在标准路径,创建符号链接 sudo ln -s /path/to/jemalloc.h /usr/include/ ``` - **错误:`undefined reference to 'je_malloc'`** 说明链接阶段找不到jemalloc库,确保编译命令包含`-ljemalloc`参数(通过`MALLOC=jemalloc`自动添加)。 ### 编译优化建议 ```bash # 使用更优化的编译选项 make CFLAGS="-march=native -O2" MALLOC=jemalloc ``` §§ 相关问题 §§ 1. 如何验证Redis运行时使用的是jemalloc内存分配器? 2. Redis编译安装后如何配置为系统服务? 3. 如何为Redis配置持久化策略? 4. Redis集群部署需要修改哪些关键参数? 5. 生产环境中Redis性能调优有哪些常用方法?[^4] [^1]: Redis编译权限问题参考官方文档: https://redis.io/docs/getting-started/installation/install-redis-from-source/ [^3]: 内存分配器选择指南: https://engineering.linkedin.com/blog/2015/05/improving-performance-with-jemalloc [^4]: Redis生产环境优化: https://redis.io/topics/latency </think> ### 解决 Redis 7.0.12 编译错误的完整方案 #### 🔍 问题分析 1. **`/bin/sh: ./configure: 权限不够`** 编译脚本缺少可执行权限,常见于源码包解压后权限丢失的情况。 2. **`致命错误:jemalloc/jemalloc.h:没有那个文件或目录`** 系统缺少 jemalloc 开发库或头文件,需安装依赖并显式启用 jemalloc。 --- ### ✅ 分步解决方案 #### 第一步:修复权限问题 ```bash # 进入 Redis 源码目录 cd redis-7.0.12 # 授予关键脚本执行权限(核心步骤) chmod +x configure chmod +x deps/jemalloc/configure # 特别注意此文件[^1] chmod +x src/mkreleasehdr.sh # 验证权限 ls -l configure deps/jemalloc/configure ``` *预期输出*:`-rwxr-xr-x`(含 `x` 表示成功) #### 第二步:解决 jemalloc 依赖 ```bash # 安装 jemalloc 开发库(CentOS/RHEL) sudo yum install -y jemalloc jemalloc-devel # Ubuntu/Debian 系统使用 # sudo apt install -y libjemalloc-dev # 清理旧编译文件 make distclean ``` #### 第三步:显式启用 jemalloc 编译 ```bash # 关键编译命令(必须指定内存分配器) make MALLOC=jemalloc ``` #### 第四步:完整安装流程 ```bash # 1. 安装基础编译工具 sudo yum install -y gcc make automake autoconf # 2. 修复所有脚本权限 chmod +x configure src/mkreleasehdr.sh deps/*/configure # 3. 编译安装 make MALLOC=jemalloc sudo make install PREFIX=/opt/redis ``` --- ### 💡 关键技术点 1. **权限修复优先级** `deps/jemalloc/configure` 权限缺失是导致 `jemalloc.h` 错误的常见原因[^1],必须显式修复: $$ \text{chmod} +x \text{deps/jemalloc/configure}$$ 2. **jemalloc 显式启用** Redis 默认尝试使用 jemalloc,但需通过编译参数强制指定: $$ \text{make MALLOC=jemalloc}$$ 3. **依赖验证命令** ```bash # 检查 jemalloc 头文件 ls /usr/include/jemalloc/jemalloc.h # 验证编译器路径 which cc ``` --- ### ⚠️ 常见错误排查 | 错误现象 | 解决方案 | |---------|---------| | `cc: not found` | 安装 gcc: `sudo yum install gcc` | | `jemalloc.h missing` | 检查 `jemalloc-devel` 是否安装 | | 权限修复后仍报错 | 执行 `make distclean` 彻底清理 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值