本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边。

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

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

   sudo apt-get install lua5.

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

   sudo apt-get install liblua5.-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 = ,
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, -); //读取查到的结果,当然,需要先做类型判断
lua_isstring(L, -)
string str = lua_tostring(L, -); //至此,我们便从lua脚本的table中取得了我们想要的元素。
//当然最后别忘了销毁现场
lua_close(L);

全部源码如下:

    ①、Data.lua

     --Data.lua
Data =
{
name = "zhang_yi" ,
age = ,
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 ;
  }
int ret = luaL_dofile(L ,"Data.lua");
  if(ret)
  {
      cout<<"Lua doFile Error !"<<endl;
      return ;
  }
  lua_getglobal(L, "Data");
  lua_pushstring(L, "name");
  lua_gettable(L, -);
if(lua_isstring(L, -))
  {
      string str = lua_tostring(L, -);
      cout<<str<<endl;
  }   lua_close(L);
  return ;
}

    ③、mylua.h

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

最后,编译运行

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

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

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

便可以达到目的。

Linux下C/C++和lua交互-Table的更多相关文章

  1. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  2. Linux下安装PHP的lua扩展库

    一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-.tar.gz tar xvf lua-.tar.gz cd lua- 重要:进入解压缩后的路径 cd .../ ...

  3. Linux下利用expect,不用交互模式,直接登陆远程主机

    Linux环境下只有在机器20.200.254.18上ssh dataconv@20.200.31.23才能连接到23的机器,而且还需要输入密码(每次都需要输入地址,密码很烦),所以利用expect写 ...

  4. linux下安装php的lua扩展

    1. 进入管理员权限使用yum安装 readline(也可以使用wget下载后./configure 然后 make && make install进行安装) yum install ...

  5. Windows和Linux上用C与Lua交互

    Windos2010编译lua的方法: http://blog.csdn.net/appletreesujie/article/details/12065369 Linux编译lua的方法: make ...

  6. Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本

    一.引言         学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写L ...

  7. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  8. Linux下MySQL报Table 'xxx' doesn't exist错误解决方法,表名存在大小写区分

    Linux服务器上在线装了个MySQL,但是部署web应用时一直报后台一直报错:Table 'xxx' doesn't exist. 本地测试一直都是正常的,同样的代码,同样的数据库,表是存在的,但是 ...

  9. linux下C调用lua的第一个程序

    linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...

随机推荐

  1. Android自动问题——黑屏、死机等解决方法

    今天用了下Android Studio,出现了一些问题,现在将启动过程中遇到的问题和解决方案列出来,方便大家参考. 安装过程不多说,网上一搜一大把. 那直接说问题吧: 1. 无法启动,报错:Faile ...

  2. 【PHP】linux+php5.1.6+mysql5.0.2+apache2.0.55安装配置说明(转)

    linux+php5.1.6+mysql5.0.2+apache2.0.55安装配置说明:一.mysql5.0.2的安装配置过程及说明:1. #tar -zvxf mysql-5.0.2-alpha. ...

  3. python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库

    如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...

  4. jquery.flexslider.js带左右箭头且带按钮可滚动的图片插件

    一.插件介绍 FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.FlexSlider对于网站开发者来说是一个不错测JQUERY特效,因为支持全浏览器 ...

  5. Python 文件的处理

    简单的读取文件 f.read()  是读取这个文件的所有内容 f.readline()  是读取文件的一行 .write()  会去检查这个文件是否存在,不存在则创建,存在的话,则以覆盖的方式将内容写 ...

  6. centos7源码编译安装Ansible详细部署

    一.基础介绍==========================================================================================ansi ...

  7. nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件

    一.简介 插件源码下载:点击下载 微信公众平台网站授权帮助地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp142114084 ...

  8. MyEclipse Web 项目导入 Eclipse 中需要改的文件

    来自为知笔记(Wiz)

  9. 日常API之C#百度人脸识别

    最近看到一只我家徒儿发来的链接,原来是一堆百度AI的SDK,于是一时兴起就做了一只人脸识别,喵喵喵(●'◡'●) 一.准备工作 首先,当然是下载SDK啦:http://ai.baidu.com/sdk ...

  10. Spring思维导图(MVC篇)

    写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸. 已经很久没有发文章了呀,想必大家都挂念我了,哈哈. 温故而知新,今天一起来复习一下spring mvc的内容吧. spring mvc简介与运行 ...