嵌入式Linux开发一般是使用C/C++语言的,Lua作为一种轻量化而且功能强大的脚本语言,Lua可以通过虚拟栈的方式轻松自如地于C/C++互相调用。可以在C/C++中调用Lua编写的.lua文件,也可以在Lua脚本中调用C/C++的动态库,这些资料在《Beginning Lua Programming》中都有详细介绍,在此就不再多言。根据我们的项目需要,以下将介绍一种在项目中实用性比较强,移植性较好的方法。
本人使用的是4.3.2交叉编译链,方法是直接编译出可执行文件,在C文件中,把lua代码写进数组中,调用lua库,然后实现在C代码中运行lua。先贴出测试代码如下:
-
#include <string.h>
-
#include "lua.h"
-
#include "lauxlib.h"
-
#include "lualib.h"
-
-
int main()
-
{
-
char *buff = "FileHnd, ErrStr = io.open(\"text.txt\", \"w\")\n\
-
print(FileHnd, ErrStr)\
-
FileHnd:write(\"Line 1\\nLine 2\\nLine 3\\n\")\n\
-
FileHnd:close()\n\
-
FileHnd, ErrStr = io.open(\"text.txt\")\n\
-
print(FileHnd, ErrStr)\n\
-
print(FileHnd:read())\n\
-
print(FileHnd:read())\n\
-
print(FileHnd:read())\n\
-
FileHnd:close()\n\
-
print(os.remove(\"text.txt\"))\n";
-
int error;
-
lua_State *L = luaL_newstate(); // 打开Lua
-
luaL_openlibs(L); // 打开标准库
-
// while (fgets(buff, sizeof(buff), stdin) != NULL)
-
// {
-
error = luaL_loadbuffer(L, buff, strlen(buff), "openFileRW")
-
|| lua_pcall(L, 0, 0, 0);
-
if (error)
-
{
-
fprintf(stderr, "%s", lua_tostring(L, -1));
-
lua_pop(L, 1); // 从栈中弹出错误消息
-
}
-
// }
-
-
lua_close(L);
-
return 0;
-
}
由以上代码可见,调用luaL_loadbuffer函数就可以调用buff数组中的Lua代码了,在这里要注意转义字符的使用,对此也不加赘述了。
要在开发板上实现以上代码,我们甚至不需要Lua解释器,只需要在编译过程中包含lua相关的头文件和链接必须的库文件即可。我们首先需要用arm-linux-gcc来编译lua5.1源码。
首先,我们需要修改lua5.1/src中的Makefile:
PLAT= none 修改为 PLAT= ansi
CC= arm-linux-gcc
linux:
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl
-lreadline -lhistory -lncurses"
修改为
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl"
然后,修改同一目录下的luaconf.h文件,删掉
LUA_USE_READLINE。
做好修改之后,我们退回到Lua-5.1的目录下,直接make linux,完成后,不许要安装,直接把src目录下的liblua.a静态库,cp到你交叉编译链的Lib目录下,或者你随便找个目录放,只要编译的时候链接上即可。
紧接着,我们就可以编译以上代码了,下面是我的编译命令:
arm-linux-gcc test.c -o test /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/liblua.a -I /usr/local/arm/4.3.2/arm-none-linux-gnueabi/include/ -lm -ldl
把test复制到开发板,./test 执行即可,执行结果如下:
file (0x2560a8) nil
file (0x256078) nil
Line 1
Line 2
Line 3
true
好了,接下来,我们就可以开始我们的Lua fo Arm的开发之路了,哈哈。
阅读(1097) | 评论(0) | 转发(0) |