首先搭建环境,使用vs2010的c++开发工具,lua源码包,可以去官方下载最新源码包,我采用的是lua-5.1.5的版本。好了,开始配环境。


第一步:

  1. 下载源码包后,解压lua-5.1.5源码包到硬盘。如:D:\lua-5.1.5\。

  2. 在VS2010中新建一个静态库项目,项目命名为lua51,具体步骤如下:


  • 打开VS2010->文件-->项目-->Virual C++-->Win32-->Win32项目-->输入项目名,如lua51。

  • 弹出向导,点下一步,选择静态库,去掉预译头,点击完成。

    200341365.jpg

  • 复制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++-->常规-->附加包含目录如图:

    203440815.jpg


  • 添加链接库引用,配制属性-->链接器-->常规-->附加库目录-->添加D:\lua-5.1.5\src\lua51.lib

    222236795.jpg


  • 至此环境就配好了,下一步实现代码了。


第三步,代码的实现:

新建一个类,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


运行效果:


205033418.jpg