首先搭建环境,使用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
运行效果: