Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19279
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-23 14:19
个人简介

我要成为多面手!

文章分类
文章存档

2015年(15)

我的朋友

分类: LINUX

2015-10-15 14:50:31

    嵌入式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。先贴出测试代码如下:

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include "lua.h"
  3. #include "lauxlib.h"
  4. #include "lualib.h"

  5. int main()
  6. {
  7.     char *buff = "FileHnd, ErrStr = io.open(\"text.txt\", \"w\")\n\
  8.                   print(FileHnd, ErrStr)\
  9.                   FileHnd:write(\"Line 1\\nLine 2\\nLine 3\\n\")\n\
  10.                   FileHnd:close()\n\
  11.                   FileHnd, ErrStr = io.open(\"text.txt\")\n\
  12.                   print(FileHnd, ErrStr)\n\
  13.                   print(FileHnd:read())\n\
  14.                   print(FileHnd:read())\n\
  15.                   print(FileHnd:read())\n\
  16.                   FileHnd:close()\n\
  17.                   print(os.remove(\"text.txt\"))\n";
  18.     int error;
  19.     lua_State *L = luaL_newstate(); // 打开Lua
  20.     luaL_openlibs(L); // 打开标准库
  21. // while (fgets(buff, sizeof(buff), stdin) != NULL)
  22. // {
  23.         error = luaL_loadbuffer(L, buff, strlen(buff), "openFileRW")
  24.             || lua_pcall(L, 0, 0, 0);
  25.         if (error)
  26.         {
  27.             fprintf(stderr, "%s", lua_tostring(L, -1));
  28.             lua_pop(L, 1); // 从栈中弹出错误消息
  29.         }
  30. // }
  31.  
  32.     lua_close(L);
  33.     return 0;
  34. }
    由以上代码可见,调用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) |
给主人留下些什么吧!~~