编译Lua语言到 imx283平台并动态加载so库

编译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.4lua-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

故改变思路:将lualiblua.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

3luaconf.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后就生成可执行文件lualuac

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

 

 

你可能感兴趣的:(lua,linux,arm)