(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++文件中的函数。。