C++与Lua的简单交互(1)
以下演示环境基于VS2010平台。
1. 环境配置
先下载好Lua的库和头文件。
接着,新建Windows空的控制台项目。在项目属性里指定库路径和头文件路径。这里我直接把库文件放到了工程目录下面,而头文件路径我在程序里面使用了相对路径。
2. 添加一个myLuaScrip.lua文件,代码如下
lua.hpp中的代码
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
----------------------------------myLuaScrip.lua-----------------------------------------------
print("Hello Kitty!!!")
function myFunction(a, b, c) ------ 该函数演示参数的传递
print("in function abc")
print(a..b..'+'..c..'=')
return b+c
end
function luaAdd(num1, num2)
print("in luaAdd")
print(cplusplusAdd(num1,num2)) ------此处调用C++中定义的函数
print("exit luaAdd")
end
--------------------------------------------------------------------------------------------------
接着添加main.cpp文件,代码如下
----------------------------------------main.cpp-----------------------------------------------
extern "C" {
#include "..\lua\include\lua.hpp"
#pragma comment(lib, "lua51.lib")
}
#include <iostream>
#include <string>
using namespace std;
int cplusplusAdd(lua_State *L) // 准备在lua中调用的函数
{
cout << "in cplusplusAdd" << endl;
int num1 = luaL_checknumber(L,1); // 读入传入的两个参数
int num2 = luaL_checknumber(L,2);
lua_pushnumber(L,num1+num2); // 返回结果
cout << "exit cplusplusAdd" << endl;
return 1;
}
int main(int argc , char* argv[])
{
lua_State *L = luaL_newstate(); //初始化Lua,创建一个解析器句柄。5.0以后版本建议采用
//等价于// lua_State *L = lua_open();
luaL_openlibs(L); // 载入所有Lua标准库
bool err = luaL_dofile(L,"myLuaScrip.lua"); // 加载文件
//等价于// bool err = luaL_loadfile(L,"myLuaScrip.lua") || lua_pcall(L,0,0,0);
if (err) // 载入文件发生错误
{
cerr << lua_tostring(L,-1) << endl; // 显示错误
lua_pop(L,1); // 弹出栈上的错误信息
}
///C++调用Lua///
lua_getglobal(L,"myFunction");
if (lua_isfunction(L,-1)) // 确认取到的是函数
{
lua_pushstring(L,"count:"); // 传入参数
lua_pushnumber(L,123); // 传入参数
lua_pushnumber(L,456); // 传入参数
if (lua_pcall(L,3,1,0)) // 是否调用函数发生异常。3代表3个参数,1代表1个返回值
{
cerr << lua_tostring(L,-1) << endl; // 打印错误信息
lua_pop(L,1);
}
else
{
cout << lua_tostring(L,-1) << endl; // 输出myFunction函数的返回结果
lua_pop(L,1); // 弹出结果
}
}
else
{
cerr << lua_tostring(L,-1) << endl;
lua_pop(L,1);
}
///Lua调用C++///
lua_pushcfunction(L,cplusplusAdd);
lua_setglobal(L,"cplusplusAdd");
lua_getglobal(L,"luaAdd");
if (lua_isfunction(L,-1))
{
lua_pushnumber(L,9); // 传入参数
lua_pushnumber(L,8);
if (lua_pcall(L,2,0,0))
{
cerr << lua_tostring(L,-1) << endl; // 打印错误信息
lua_pop(L,1);
}
}
else
{
cout << lua_tostring(L,-1) << endl;
lua_pop(L,1);
}
lua_close(L); // 关闭
system("PAUSE");
return 0;
}
--------------------------------------------------------------------------------------------------
3. 执行结果