在C/C++中使用lua

(1)编译、安装lua

1、在lua官网下载lua源码 xxx..tar.gz

解压 tar -xzvf   xxx..tar.gz

cd xxx  //进入解压后的目录

ls    //可以看见有一个makefile文件

2、编译

输入 make  zzzz     //其中zzz为platform 如linux、aix,mac os等

3、编译完成 安装

输入 make install

完成后,检查是否安装成功

输入 lua     //会出来lua的相应版本信息

继续输入 print("hello lua!")    //test

 

(2)单独使用lua

//创建一个.lua文件 如test.lua

touch  test.lua

//编辑文件

vi  test.lua

//test.lua

//lua中单行注释使用--      多行注释使用--[[    --]]

--add two numbers        

function addnums(a,b)

  return a + b

end

--connect two strings

function addstring(a,b)

  return a .. b

end

--从终端输入两个数

x = io.read("*number")

y = io.read("*number")

--调用上面的函数

sum = addnums(x,y)

print("sum is " .. sum)

//保存退出

//在linux命令行中

cd xxx     //进入文件目录

//运行lua文件

lua  test.lua

 

(3)c/c++调用lua

//先创建一个.c或.cpp的文件,在此文件中调用lua

//如创建 temp.cpp的c++文件

//先包含lua的.h文件 由于lua是ansi c的,所以在.cpp文件中使用extern “C”声明

//temp.cpp

extern ''C"

{

  #include "lua.h"

  #include "lualib.h"

  #include "lauxlib.h"

}

#include <iostream>

lua_State  *L;        //lua状态机

//C/C++ function call  lua function

int sum(int a,int b)

{

  lua_getglobal(L,"addnums");    //从lua中得到全局变量addnums,lua中function也一种值类型

  lua_pushnumber(L,a);       //参数压栈

  lua_pushnumber(L,b);

  lua_call(L,2,1);           //call function "addnums"  in test.lua 2 为参数个数  1 为返回值个数

  int sum = lua_tonumber(L,-1);    //call结束后function会将返回值压栈    lua中栈元素编号从1开始,-1表示最上面一个

  lua_pop(L,1);           //清栈

  return sum;

}

int main()

{

  L = lua_open();    

  luaopen_base(L);     //load lua libs

  luaL_dofile(L,"test.lua");  //load lua file

  int x,y;            //enter two nums

  std::cin >> x >> y ;

  int sum = sum(x,y);    //call sum function

  std::cout << sum << std::endl;

 

  lua_close(L);

  return 0;

}

编译

g++ temp.cpp -llua -ldl -o temp

运行

./temp

(4)lua 调 C/C++函数    

//C/C++函数有固定格式 int (*lua_CFunction) (lua_State *L) 返回值为int 表示函数返回给lua的返回值个数

由于lua_State支持栈,所以不需考虑参数传递问题


//temp.cpp

extern ''C"

{

  #include "lua.h"

  #include "lualib.h"

  #include "lauxlib.h"

}

#include <iostream>

lua_State  *L;        //lua状态机

//定义一个C++函数供lua调用

//写一个求sum、average的函数

int average(lua_State *L)

{

  int n = lua_gettop(L);    //lua调此函数时的参数个数 lua_gettop()是取得栈顶元素的序号,而栈是从1开始编号,所以得到的是                栈中元素个数,也就是传入的参数个数

  int sum = 0;

  //取得lua传入的参数  从栈中取

  for(int i = 1; i <= n; ++i)    //注意栈序号从1开始

  {

    sum += lua_tonumber(L,i);    //取得栈中第i个元素并转为number

  }  

  lua_pushnumber(L,sum / n);    //将返回给lua的值压入栈中

  lua_pushnumber(L,sum);

  

  return 2;        //返回给lua的值个数

}

 

int main()

{

  L = lua_open();    

  luaopen_base(L);     //load lua libs

  lua_register(L,"average",average);    //由于lua并不知道C++文件中的函数,所以register一下告诉lua有这样一个函数

  luaL_dofile(L,"average.lua");  //load lua file

  lua_close(L);

  return 0;

}

 

//average.lua

avg,sum = average(10,20,30,40,50)

print("average is " .. avg)

print("sum is " .. sum)

 

编译、运行

g++ temp.cpp -llua -ldl -o temp

./temp

(5)注意不管是lua func 调 C/C++ func,还是C/C++ func 调 lua func

最终运行都是在C/C++程序中,并不是直接执行lua script就可以调C/C++文件中的函数。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值