Linux下C/C++和lua交互-Table
本来这些文章都是在我的个人网站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的更多相关文章
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- Linux下安装PHP的lua扩展库
一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-.tar.gz tar xvf lua-.tar.gz cd lua- 重要:进入解压缩后的路径 cd .../ ...
- Linux下利用expect,不用交互模式,直接登陆远程主机
Linux环境下只有在机器20.200.254.18上ssh dataconv@20.200.31.23才能连接到23的机器,而且还需要输入密码(每次都需要输入地址,密码很烦),所以利用expect写 ...
- linux下安装php的lua扩展
1. 进入管理员权限使用yum安装 readline(也可以使用wget下载后./configure 然后 make && make install进行安装) yum install ...
- Windows和Linux上用C与Lua交互
Windos2010编译lua的方法: http://blog.csdn.net/appletreesujie/article/details/12065369 Linux编译lua的方法: make ...
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
一.引言 学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写L ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Linux下MySQL报Table 'xxx' doesn't exist错误解决方法,表名存在大小写区分
Linux服务器上在线装了个MySQL,但是部署web应用时一直报后台一直报错:Table 'xxx' doesn't exist. 本地测试一直都是正常的,同样的代码,同样的数据库,表是存在的,但是 ...
- linux下C调用lua的第一个程序
linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...
随机推荐
- swift3.0 coreData的使用-日记本demo
效果 需求分析 基于官方MasterDetail模板,官方写了很多复杂的coredata逻辑,在此基础上快速开发简单的日记本程序. - 主要功能:增.删.改.查 - 界面用默认的界面,将detail页 ...
- php+sqlserver实现分页效果
找了一些实现的代码,都或多或少有点问题. 主要问题在于: 在进行一页数据查询时的sql语句格式问题, 开始尝试使用limit关键字查询,错误,limit用于mysql: 接着使用ROWNUM.row_ ...
- ASPCMS改造中
10月中旬的时候,芹芹大神给我接了个做网站的活,一番商量过后,我以低得说出来丢人TT的价格接了.主要是想借此摸清网站制作的一条龙服务. 目前根据ASPCMS开源管理系统,做了个大致的构架,下面上草图: ...
- webpack2 项目
webpack2 项目 实例gif图: 目录截图: 目录介绍: dist目录(最后生成的目录,里面文件为配置webpack自动生成的): c/:css文件夹; i/:img文件夹; j/:js文件 ...
- Spring-Framework 源码阅读之@Autowired和AutowiredAnnotationBeanPostProcessor
今天接下去讲我们的内容,上次的解析了AnnotationBeanUtils这个类的运用和源码.今天主要关注的是Autowired和 AutowiredAnnotationBeanPostProcess ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- [补档][Poi2010]Monotonicity 2
[Poi2010]Monotonicity 2 题目 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列 ...
- hdu 6045 Is Derek lying?(思维推导)
Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.This sum ...
- Nodejs package.json文件介绍
每个npm的安装包里面都会包含一个package.json,通常这个文件会在包的根目录下. 这个文件很类似于.net项目中的.csproj+AssemblyInfo.cs+App.config文件,主 ...
- vue学习笔记(1)—— 组件化实现todoList
一.环境搭建 1.npm 大型应用时推荐用npm安装,npm能很好的和webpack等模块打包器配合使用.具体安装步骤请参考网上的诸多教程.完成后使用如下命令安装vue. $ npm install ...