本来这些文章都是在我的个人网站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. oracle-plsql序列问题

    场景:用来汇总工作中数据库的异常问题! 1 问题 序列在会话中未定义 解决: 创建Sequence后直接查询它的当前值(CURRVAL)会出错,要先调用Sequence对象.NEXTVAL,才能查询当 ...

  2. (转)Linux下增加交换分区的大小

    场景:最近在Linux环境安装ELK相关软件时候发现机器特别的卡,所以就查看了Linux机器的内存使用情况,发现是内存和交换分区空间太小了. 对于虚拟机中的内存问题,可以直接通过更改虚拟机的硬件进行解 ...

  3. showcase,开发中必须引起重视的小环节

    有人说,测试者来自火星,开发者来自金星.这是因为软件测试员和软件开发者就好比一对冤家,里面的缘由说不清也道不明.开发代表着创造,而测试则代表着摧毁,因为测试的目的就是以各种方式不断地从开发出的产品中发 ...

  4. swift 3.0 基础练习 面向对象 类

    模拟需求 创建100个女朋友 1.用面向对象思想 2.名字随机 3.年龄随机 4.拥有约会功能 5.将所有女朋友信息输出 class GirlFirend: NSObject { var name:S ...

  5. 安装cocoaPods第三方类库

    *1 检测gem 镜像文件     输入指令: gem sources -l     回车后得到镜像地址.可能是一个,也可能有好几个,常见两个如下 https://rubygems.org/     ...

  6. JavaScript系统学习小结——Object类型、Array类型

    今天学习JavaSript中引用变量中的Object类型和Array类型: 1. Js中大多数引用类型值都是Object类型的实例,Object类型在应用程序中存储和传输数据时,是非常理想的选择: 创 ...

  7. JStorm与Storm源码分析(二)--任务分配,assignment

    mk-assignments主要功能就是产生Executor与节点+端口的对应关系,将Executor分配到某个节点的某个端口上,以及进行相应的调度处理.代码注释如下: ;;参数nimbus为nimb ...

  8. 关于vue组件的一个小结

    用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...

  9. Linux(3)用户和权限管理

    用户, 权限管理 Linux中root账号通常用于系统的维护和管理, 它对操作系统的所有部分具有不受限制的访问权限 在Unix/Linux安装过程中, 系统会自动创建许多用户账号, 而这些默认的用户就 ...

  10. echarts3.0使用总结

    echarts的使用和例子传送门 1.安装echarts npm install echarts --save 这里配置好了,直接输入 npm install //下载插件 npm start //运 ...