设为首页 收藏本站
查看: 955|回复: 0

[经验分享] Linux下C/C++和lua交互-Table

[复制链接]

尚未签到

发表于 2017-11-22 21:51:43 | 显示全部楼层 |阅读模式
  本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边。
  最近这两天需要弄清楚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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-409669-1-1.html 上篇帖子: 【Linux基础】在 Linux 上安装软件的 3 种方法 下篇帖子: 0014.Linux环境搭建 Python环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表