lua 源码直接 make platform 编译没什么好说的,这里就说一下需要注意的地方。

编译为so库

默认的编译只有 .a 库, so 库只能自己动手了.

修改 Makefile

将根目录中的Makefile作如下修改:


1
TO_LIB= liblua.a

改为

1
TO_LIB= liblua.a liblua.so

在src/Makefile中寻找合适的位置添加:

1
2
3
4
LUA_SO=liblua.so
$(LUA_SO): $(CORE_O) $(LIB_O)
$(CC) -o $@ -shared $? -ldl -lm


1
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)

改为

1
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)

END

编译完成后有两个主要的可执行文件lualuac 和两个库 liblua.aliblua.so.

lua : 虚拟机,用来执行 lua 代码
luac : 编译器,用来为 lua 代码做一些优化什么的 (并不是说脚本语言就不需要编译器了啊啊啊啊)
liblua.a : 静态库
liblua.so : 动态库

为Android平台编译

新建 liblua.mkAndroid.mk, 写入:

liblua.mk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
LIB_VERSION:=lua-5.3.3-src
SRC_ROOT_PATH:= ../../$(LIB_VERSION)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := liblua
LOCAL_CFLAGS := -D"lua_getlocaledecpoint() ='.'" -DLUA_USE_C89
LOCAL_SRC_FILES := \
$(SRC_ROOT_PATH)/src/lapi.c \
$(SRC_ROOT_PATH)/src/lauxlib.c \
$(SRC_ROOT_PATH)/src/lbaselib.c \
$(SRC_ROOT_PATH)/src/lbitlib.c \
$(SRC_ROOT_PATH)/src/lcode.c \
$(SRC_ROOT_PATH)/src/lcorolib.c \
$(SRC_ROOT_PATH)/src/lctype.c \
$(SRC_ROOT_PATH)/src/ldblib.c \
$(SRC_ROOT_PATH)/src/ldebug.c \
$(SRC_ROOT_PATH)/src/ldo.c \
$(SRC_ROOT_PATH)/src/ldump.c \
$(SRC_ROOT_PATH)/src/lfunc.c \
$(SRC_ROOT_PATH)/src/lgc.c \
$(SRC_ROOT_PATH)/src/linit.c \
$(SRC_ROOT_PATH)/src/liolib.c \
$(SRC_ROOT_PATH)/src/llex.c \
$(SRC_ROOT_PATH)/src/lmathlib.c \
$(SRC_ROOT_PATH)/src/lmem.c \
$(SRC_ROOT_PATH)/src/loadlib.c \
$(SRC_ROOT_PATH)/src/lobject.c \
$(SRC_ROOT_PATH)/src/lopcodes.c \
$(SRC_ROOT_PATH)/src/loslib.c \
$(SRC_ROOT_PATH)/src/lparser.c \
$(SRC_ROOT_PATH)/src/lstate.c \
$(SRC_ROOT_PATH)/src/lstring.c \
$(SRC_ROOT_PATH)/src/lstrlib.c \
$(SRC_ROOT_PATH)/src/ltable.c \
$(SRC_ROOT_PATH)/src/ltablib.c \
$(SRC_ROOT_PATH)/src/ltm.c \
$(SRC_ROOT_PATH)/src/lua.c \
$(SRC_ROOT_PATH)/src/lundump.c \
$(SRC_ROOT_PATH)/src/lvm.c \
$(SRC_ROOT_PATH)/src/lzio.c \
$(SRC_ROOT_PATH)/src/lutf8lib.c\
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)
#include $(BUILD_EXECUTABLE)

Android.mk

1
2
LOCAL_PATH:= $(call my-dir)
include $(LOCAL_PATH)/liblua.mk

此时文件结构如图 (lua-5.5.5-src文件夹为下载的源码,其他是新建的):

进入jni文件夹执行ndk-build编译, 成功后的文件结构如图:

错误列表

错误1

1
file not recognized: 不可识别的文件格式

执行

1
make clean

错误2

1
2
/usr/bin/ld: lapi.o: relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC
lapi.o: error adding symbols: 错误的值

将src/Makefile文件中的

1
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)

改为

1
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) -fPIC $(MYCFLAGS)

错误3

1
error: 'struct lconv' has no member named 'decimal_point'

luaconf.h中的

1
#define lua_getlocaledecpoint() (localeconv()->decimal_point[0])

改为

1
#define lua_getlocaledecpoint() '.'

或者 在makefile加上选项 -D"lua_getlocaledecpoint() ='.'". (完整makefile内容见上)

错误4

1
undefined reference to 'log2'

makefile 加上选项 -DLUA_USE_C89 . (完整makefile内容见上)