linux下安装lua 于c++交互

最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程。

        首先是环境环境,Linux(Debian),安装lua,注意需要管理员权限。

sudo apt-get install lua5.2

安装完后输入lua或者lua -v 严重是否安装成功以及安装的版本,当然,有了lua运行环境还不够我们还需要安装lua开发库既然我们安装的是lua5.2那么开发库同样安装成5.2版本,命令如下:

sudo apt-get install liblua5.2-dev

当然,lua的环境准备好了,既然要研究lua和C/C++的交互,那gcc/g++是必不可少的,至于怎么安装,此处略过,默认认为已安装好。

        那么接下来就得写代码验证一下,因为lua是一种解释性语言,它不不同于C/C++,且两者之间不能直接做数据交互,需要一种类似于“栈”的结构来实现数据交互,规定是:C/C++有C/C++的环境,lua有lua的环境,两张互不干扰,如需交互数据,双方都要把数据放入“栈”中;并且lua和C/C++的数据类型也不相同,所以不能直接从栈中拿来使用。以下说明一种最典型的lua数据类型-table,如下:

//Data.lua
     Data =
      {
         name = "zhang_yi" ,
         age = 24 ,
         homepage = "zhangyi.studio" ,
         lover = "lijuanxian" ,
       }

 假设我现在要用当前文件Data.lua中读取某个元素,例如name元素,一般有如下几个步骤:

      //创建luaState
      lua_State *L = luaL_newstate();
      
      //加载lua文件,dofile是加载并执行文件,结果是生成全局table
      luaL_dofile(L ,"Data.lua");
      
      //将我们需要处理的table置于栈顶,此时全局变量Data的index为-1(栈顶)
      lua_getglobal(L, "Data");
      
     //将我们需要读取的元素索引压栈,此时Data的index为-2,"name"的index为-1
     lua_pushstring(L, "name");
     //调用查找接口,过程:用栈顶元素作为索引在table中查找对应得元素,如果查到
     //POP索引(此处为"name"),把结果放到栈顶(查到的值返回到栈顶,index =-1)
     lua_gettable(L, -2);
     
     //读取查到的结果,当然,需要先做类型判断
     lua_isstring(L, -1)
     string str = lua_tostring(L, -1);
     
     //至此,我们便从lua脚本的table中取得了我们想要的元素。
     //当然最后别忘了销毁现场
     lua_close(L);

 全部源码如下:

    ①、Data.lua

--Data.lua
         Data =
      {
         name = "zhang_yi" ,
         age = 24 ,
         homepage = "zhangyi.studio" ,
         lover = "lijuanxian" ,
       }

②、cUseLua.cpp

   //cUseLua
    #include <iostream>
    #include <string.h>
    #include "mylua.h"
  
    using namespace std;
  
    int main()
    {
       lua_State *L = luaL_newstate();
       if(L == NULL)
       {
       cout<<"Creat Lua State Error !"<<endl;
       return 1;
       }
        int ret = luaL_dofile(L ,"Data.lua");
       if(ret)
       {
       cout<<"Lua doFile Error !"<<endl;
       return 1;
       }
       lua_getglobal(L, "Data");
       lua_pushstring(L, "name");
       lua_gettable(L, -2);
        if(lua_isstring(L, -1))
       {
       string str = lua_tostring(L, -1);
       cout<<str<<endl;
       }
  
       lua_close(L);
       return 0 ;
    }

③、mylua.h

   //mylua.h
    #ifndef MYLUA_H_
    #define MYLUA_H_
  
    extern "C"
    {
       #include<lua5.2/lua.h>
       #include<lua5.2/lauxlib.h>
       #include<lua5.2/lualib.h>
    }
    #endif 

最后,编译运行

g++ -o Main main.cpp -llua5.2

通过table交互数据的目的达到了,接下来就是C/C++调用写在lua中的函数以及lua脚本调用C/C++接口因为lua作为一种轻量级的解释性语言,不需要编译链接等步骤,所以作为C/C++内嵌语言非常合适,我们在

项目研发过程中特别希望程序能经常不变,或者说不经常改动,再此,更加体现出类似于lua这种解释性语言的魅力,一些需要经常变动的接口或者逻辑用lua来写,然后让主程序(C、C++)通过固定的接口来调用,这样

便可以达到目的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LuaStudio是一款快速的、轻量级的、可扩展的lua脚本编辑器软件。软件最大特点就是可以注入到宿主程序内对lua脚本进行调试,还可以设置断点观察变量的值,此外,软件还具有编辑、工程管理、调试、远程调试、等各种功能。需要的朋友快来下载吧! LuaStudio编辑调试器特色 1、工程管理、添加解决方案里所有的符号提示功能、有跳转到函数定义处的功能、 2、代码定义提示窗口、能自动跳转提示 3、调试内核重新优化、速度能大大提高、 4、解决了Attach调试时临时变量有几率提示不正确的BUG、 5、添加FTP相关模块功能 6、解决某些大文件会崩溃的BUG 7、调试时鼠标悬浮提示框提示table时、会格式化提示、(以前是一行、可能会很长) 8、代码智能完成提示时优化了速度、可以提示项目中所有的符号 9、添加了全局符号查找定位功能窗口 10、右侧的变量列表窗品添加点击排序功能、隐藏匿名函数功能 11、添加了dostring、dobuffer调试时的窗口 12、解决了多文件查找某些UTF-8格式中文查找不到的BUG 13、解决方案右键菜单添加了两个菜单项 *折叠所有、*展开所有 14、修改了调试时光标不会跳转到输出窗口的建议 15、软件退出时自动保存当前布局、并且自动加载上次没有关闭的文件 《添加一个菜单选项是否自动加载上次未关闭文件》 16、添加了设置新建文件编码格式的选项 17、Ctrl Tab 能够记住上次所在行、可以跳转到最近修改位置 18、debug设置框添加了记住上次调试设置、 19、添加了脚本运行性能分析功能 20、UTF-8格式下print中文时乱码 21、打中文文件名乱码的BUG、 22、debug设置框添加了一个选项能让宿主中的print捕获到Output 23、调试出现错误时会弹框、上面有中断、继续、忽略可供选择 24、解决了Attach调试时local类型的upvalue不能显示问题 25、解决了lua报错后不能通过双击输出栏跳转到报错的行处的BUG 26、lua自动升级会失败的BUG 27、解决了目录浏览窗口会崩溃的BUG 28、GetModulePath这个接口改成GetRootPath了 29、使用了lua5.2.2引擎、所以支持goto等关键字了 LuaStudio编辑调试器截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值