本来这些文章都是在我的个人网站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. LuaFramework热更新过程(及可更新的loading界面实现)

          1.名词解释: 资源包:点击 LuaFramework  |  Build XXX(平台名) Resource,框架会自动将自定义指定的资源打包到StreamingAssets文件夹,这个 ...

  2. (转)CentOS6.5下Redis安装与配置

    场景:项目开发中需要用到redis,之前自己对于缓存这块一直不是很理解,所以一直有从头做起的想法. 本文详细介绍redis单机单实例安装与配置,服务及开机自启动.如有不对的地方,欢迎大家拍砖o(∩_∩ ...

  3. (转)js jquery.qrcode生成二维码 带logo 支持中文

    场景:公司最最近在开发二维码支付业务,所以需要做一个html5中的二维码生成和部署! 前天用js生成二维码,节省服务器资源及带宽 原版jquery.qrcode不能生成logo,本文采用的是修改版 1 ...

  4. 【javascript】ajax的参数

    1. 常用参数 url type: contentType: dataType: data: success: error 2. 特殊参数 context: 这个对象用于设置Ajax相关回调函数的上下 ...

  5. [Android]Android焦点流程代码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7286503.html 通过View的View::focusSe ...

  6. CentOS 7 安装Subversion, 并用Nginx代理

    环境:CentOS 7.3.1611 分三步:第一步:安装subversion第二步:安装httpd第三步:安装nginx 操作步骤: 安装subversion, 命令 -> yum -y in ...

  7. 如何关闭浏览器的HSTS功能

    在安装配置 SSL 证书时,可以使用一种能使数据传输更加安全的Web安全协议,即在服务器端上开启 HSTS (HTTP Strict Transport Security).它告诉浏览器只能通过HTT ...

  8. 勤快的love枫[ZJOI2007]

    题目描述 小绝恋love 枫是一个出纳,经常需要做一些统计报表的工作.今天是绝恋love 枫的生日,小绝恋love 枫希望可以帮爸爸分担一些工作,作为他的生日礼物之一.经过仔细观察,小绝恋love 枫 ...

  9. Java restful web service 开发入门

    可用的框架有不少,我用的是jersey. 直接上代码,其实,如果你会web service 这个restful的就很好理解了,自己跑一遍就OK了 用到的类 User.java package demo ...

  10. iOS 折线图实现

    图表绘制的过程实际上是坐标位置的计算过程,至于画线只要有了position,通过CAShapeLayer+BezierPath很快就可以画出来,这里提供一个绘制折线的demo,贵在思路,有需要的可以参 ...