首先搭建环境,使用vs2010的c++开发工具,lua源码包,可以去官方下载最新源码包,我采用的是lua-5.1.5的版本。好了,开始配环境。
第一步:
下载源码包后,解压lua-5.1.5源码包到硬盘。如:D:\lua-5.1.5\。
在VS2010中新建一个静态库项目,项目命名为lua51,具体步骤如下:
打开VS2010->文件-->项目-->Virual C++-->Win32-->Win32项目-->输入项目名,如lua51。
弹出向导,点下一步,选择静态库,去掉预译头,点击完成。
复制D:\lua-5.1.5\src 目录下的*.h,*.c文件(除了Makefile,lua.c,luac.c3个文件)右键粘贴到工程中,然后编译项目,得到库文件*.lib(*你的工程名,如lua51.lib)。如果是DEBUG mode 将在Debug目录下看到一个lua51.lib文件,Release mode的lib文件在Release文件下。
将lua51.lib文件复制到D:\lua-5.1.5\src下,以后这个目录就可以被其它工程引用了。
第二步,接下来就可以创建c++工程调用lua了,具体如下:
新建一个在Win32 控制台应用程序,直接点击,即可创健一个项目。
添加对lua项目的引用,右键项目名,选择最后一项属性。
添加对头文件的用,即D:\lua-5.1.5\src,配制属性-->c/c++-->常规-->附加包含目录如图:
添加链接库引用,配制属性-->链接器-->常规-->附加库目录-->添加D:\lua-5.1.5\src\lua51.lib
至此环境就配好了,下一步实现代码了。
第三步,代码的实现:
新建一个类,InitLuaMain实现主体功能。
头文件InitLuaMain.h代码如下:
#pragma once
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
class InitLuaMain
{
public:
InitLuaMain(void);
~InitLuaMain(void);
//初始化Lua对象指针参数
void initLua();
//关闭Lua对象指针
void closeLua();
//使用Lua函数库输出内容
bool sendMessage(const char* pMessage);
//加载指定的Lua文件
bool loadLuaFile(const char* pFileName);
//执行指定Lua文件中的函数,param为传递的参数
bool runFileFunction(const char* pFunctionName, int paramX, int paramY);
//获得Lua文件中的变量
bool getVariableValue(const char* pFunctionName);
private:
//这是Lua的State对象指针
lua_State* m_pState;
};
InitLuaMain.cpp代码如下:
#include "stdafx.h"
#include "InitLuaMain.h"
#pragma comment(lib, "lua51.lib")
InitLuaMain::InitLuaMain(void)
{
m_pState = NULL;
}
InitLuaMain::~InitLuaMain(void)
{
}
//初始化Lua对象指针参数
void InitLuaMain::initLua()
{
if (NULL == m_pState)
{
//初始化Lua对象指针与库
m_pState = lua_open();
luaL_openlibs(m_pState);
}
}
//关闭Lua对象指针
void InitLuaMain::closeLua()
{
if (NULL != m_pState)
{
lua_close(m_pState);
m_pState = NULL;
}
}
//使用Lua函数库输出内容
bool InitLuaMain::sendMessage(const char* pMessage)
{
if (NULL == m_pState)
{
printf("Lua引擎初始化失败!\n");
return false;
}
luaL_dostring(m_pState,pMessage);
return true;
}
//加载指定的Lua文件
bool InitLuaMain::loadLuaFile(const char* pFileName)
{
int result = 0;
if (NULL == m_pState)
{
printf("Lua引擎初始化失败!\n");
return false;
}
//加载lua脚本文件
result = luaL_dofile(m_pState, pFileName);
if(0 != result)
{
printf("Lua引擎加载文件失败!\n");
return false;
}
return true;
}
//执行指定Lua文件中的函数,param为传递的参数
bool InitLuaMain::runFileFunction(const char* pFunctionName, int paramX, int paramY)
{
int result = 0;
if (NULL == m_pState)
{
printf("Lua引擎初始化失败!\n");
return false;
}
lua_getglobal(m_pState, pFunctionName);
lua_pushnumber(m_pState, paramX);
lua_pushnumber(m_pState, paramY);
//执行Lua中的函数,2表示传入参数的个数,1为函数返回值的个数
result = lua_pcall(m_pState, 2,1,0);
if (0 != result)
{
printf("函数调用失败!\n");
return false;
}
if(lua_isnumber(m_pState, -1) == 1)
{
int output = (int)lua_tonumber(m_pState, -1);
//清掉返回值
lua_pop(m_pState,1);
printf("\nLua文件中函数%s(%d,%d)的返回结果为:%d\n\n",pFunctionName,paramX,paramY,output);
}
return true;
}
//获得Lua文件中的变量
bool InitLuaMain::getVariableValue(const char* pVariable)
{
const char* result;
if (NULL == m_pState)
{
printf("Lua引擎初始化失败!\n");
return false;
}
//读取全局变量
lua_getglobal(m_pState, pVariable);
result = lua_tostring(m_pState, -1);
lua_pop(m_pState, 1);
printf("%s\n",result);
return true;
}
主程序入口HelloLua.cpp代码:
#include "stdafx.h"
#include "InitLuaMain.h"
int _tmain(int argc, _TCHAR* argv[])
{
InitLuaMain lua;
lua.initLua();
//这里用脚本的绝对路径
if(lua.loadLuaFile("d:/lua/hello.lua")){
//输出信息
const char* info = "print(\"这是c++用lua函数库输出的信息!\")";
lua.sendMessage(info);
//执行函数
lua.runFileFunction("test_add", 10, 20);
//显示变量
lua.getVariableValue("hello");
}
lua.closeLua();
getchar();
return 0;
}
hello.lua代码如下:
hello = "lua脚本文件中的变量值!";
function test_add(x,y)
return x + y;
end
运行效果:
转载于:https://blog.51cto.com/gyenty/1314661