编译Lua语言到 imx283平台并动态加载so库
百度搜索到的lua编译到arm上一些文章里面的方法都试过,坑也踩了一遍,均未成功。
http://blog.csdn.net/dragon101788/article/details/26740583
http://blog.csdn.net/hhh3214/article/details/50219423
http://blog.csdn.net/yangxuan0261/article/details/52093391
搜索到的文章大体上思路都是Makefile增加-static选项,编译成静态文件,但是经我实际测试lua-5.1.4和lua-5.3.3均会报警告:
liblua.a(loadlib.o): In function `ll_loadfunc':
loadlib.c:(.text+0x9cc): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
可以生成可执行文件lua,大概1.3M左右;但是此lua文件无法加载so库,总是会提示undefined symbol: lua_pushstring。
故改变思路:将lua的liblua.a文件编译为动态链接。
1、首先下载lua-5.3.3源码解压,进入文件夹src,编辑Makefile如下:
CC= /home/ctools/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)
AR= /home/ctools/arm-2011.03/bin/arm-none-linux-gnueabi-ar rcu
RAMLIB= /home/ctools/arm-2011.03/bin/arm-none-linux-gnueabi-ranlib
RM= rm -f
把这行的内容$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
改成 $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl "
2、为了把liblua.a编译为so文件,在src目录下的Makefile添加下面规则:
LUA_SO=liblua.so
LL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
$(LUA_SO): $(CORE_O) $(LIB_O)
$(CC) -o $@ -shared $? -ldl -lm
3、luaconf.h的修改
#if defined(LUA_USE_LINUX)
#define LUA_USE_POSIX
#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
//#define LUA_USE_READLINE /* needs some extra libraries */
#endif
需要把 #define LUA_USE_READLINE 注释掉
4、在src目录下 make linux,这里有个问题我编译的时候第一次make会提示
再次make linux后就生成可执行文件lua和luac。
5、编写jiaohu.c文件以在arm linux 上实现lua脚本调用c语言so文件;
#include
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
static int my_foo(lua_State* L)
{
int n = lua_gettop(L);
int isnum = lua_isnumber(L, 1);
int m = lua_tonumber(L, 1);
printf("%d %d %d\n", n, isnum, m);
lua_pushnumber(L,m);
lua_pushstring(L,"foo ret string\n");
return 2;
}
static const struct luaL_Reg libs11[] = {
{"foo", my_foo},
{NULL,NULL}
};
int luaopen_jiaohu(struct lua_State * L)
{
luaL_newlib(L, libs11);
return 1;
}
用 arm-none-linux-gnueabi-gcc jiaohu.c -I/home/vmuser/桌面/lua-5.3.3/src -L/home/vmuser/桌面/lua-5.3.3/src -shared -fPIC -o jiaohu.so -Wall编译,这样就把可以加到lua上的动态库编译好了。
6、讲生成的lua文件和jiaohu.so复制到arm linux开发板里,运行如下:
root@EasyARM-iMX283 /home/user# ./lua
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> a = require 'jiaohu'
> a.foo(22,33)
2 1 22
22.0 foo ret string
>
总结:移植lua到资源较少的arm平台上,正是由于lua语言短小精悍特点;这样今后的开发就尝试用lua来写逻辑,通过so库扩展lua来提高效率或扩展io。