编译Lua语言到 imx283平台并动态加载so库
来源:互联网 发布:淘宝金牌卖家有假货吗 编辑:程序博客网 时间:2024/05/22 03:15
编译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 <math.h>
#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语言到 imx283平台并动态加载so库
- 动态加载so库
- c/c++基础(十七) 编译与加载 动态库(.so)
- 编译动态库 .so
- lua加载动态库
- Qt Creator调用C语言编译的.So动态库
- 如何在liunx下编译一个调用到c语言开发的动态库(so文件)的fortran程序。
- iMX283编译linux源码
- so 动态加载库 Hotpatch
- android动态加载so库
- 动态加载so库文件
- so 库的动态加载
- 动态加载so库文件
- lua 编译成动态库(.so)
- NDK编译.so动态库
- 编译JNI动态库so
- 如何编译.so动态库
- Linux 动态加载动态库(.so)
- Json学习笔记
- 理解CGI、FastCGI、PHP-CGI、PHP-FPM
- __ATTRIBUTE__ 你知多少?
- 禁用ckeditor的编辑功能
- synchronized同步问题 Integer
- 编译Lua语言到 imx283平台并动态加载so库
- Java Web后台入门实战(二)-YuaneQi Sharing
- fLayer遮罩层组件 V1.0.1
- iOS 内购上线被拒问题
- spring+mybatis 多数据源切换失败的可能原因。
- eclipse汉化
- angularjs页面简单控制显隐
- 用HTML特殊字符来制作带三角边框
- 程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。