lua的入门教程-- C++(二)

时间:2021-01-13 04:04:19

     在上一节中,讲述了如何产生一个lua的静态链接库,在这一节,将讲述简单使用lua5.1.lib的过程。

     首先先建立一个新的win32 Console Application,在新工程里,为了美观,我将默认生成的文件夹删除,建立了include和src两个文件夹。在根目录下建立了三个文件夹:lib,script,include。

      lua的入门教程-- C++(二)       lua的入门教程-- C++(二)

      将上节生成的lua5.1.lib放入lib文件夹,将lua源码中的lauxlib.h,lua.h,luaconf.h,lualib.h拷贝到include文件夹。

      在VS上,将根目录中include中的四个头文件加载到include中。在src中建立AMLua.h,AMLua.cpp,AMMain.cpp三个文件。

      lua的入门教程-- C++(二)

       下面在项目属性页进行一些必要设置,包含依赖项,库路径等。

        C/C++ -- General -- Additional Include Directories:..\include

        Linker -- General -- Additional Library Directories:..\lib

        Linker -- Input -- Additional Dependencies:lua5.1.lib

        另外,检查C/C++ -- General -- Code Generation -- Runtime Library,是否与第一节编译时所记录的Multi-threaded Debug Dll(/MDd)相同,如果不同,请修改成相同的模式。

        -----------------------------------------------分割线-----------------------------------------------

        使用lua的配置以及好了,下面开始写代码试试。

        首先写一个简单的脚本,在script文件夹中建立sample.lua,里边填上: 

function luaAdd(x, y)
     return x + y
end

        (吐槽下,居然没有lua的模板,只好使用C++的)

       在AMMain.cpp中填上以下代码:

<span style="font-size:18px;">#include <iostream>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};

int main(int argc, char** argv)
{
// 初始化一个栈
lua_State* L = luaL_newstate();

// 加载lua库
luaL_openlibs(L);

// 加载lua文件
luaL_dofile(L, "..\\script\\sample.lua");

// 加载函数
lua_getglobal(L, "luaAdd");

// 传入参数
lua_pushnumber(L, 20);
lua_pushnumber(L, 40);

// 调用函数,运行
lua_pcall(L, 2, 1, 0);
int nSum = 0;
if(lua_isnumber(L, -1) == 1)
{
nSum = lua_tonumber(L, -1);
}

std::cout<< "The Sum:\t"<< nSum << std::endl;
std::cout<< "please wait..." << std::endl;
getchar();

return 0;
}</span>

   运行查看结果:输出60;      

下面对AMMain.cpp进行修改,对lua提供的函数进行简单封装:

<span style="font-size:18px;">#include <iostream>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};

lua_State* L;
int luaAdd(int x, int y);

int main(int argc, char** argv)
{
// 初始化一个栈
L = luaL_newstate();

// 加载lua库
luaL_openlibs(L);

// 加载lua文件
luaL_dofile(L, "..\\script\\sample.lua");

int nSum = luaAdd(20, 60);

std::cout<< "The Sum:\t"<< nSum << std::endl;
std::cout<< "please wait..." << std::endl;
getchar();

return 0;
}

int luaAdd(int x, int y)
{
// 加载函数
lua_getglobal(L, "luaAdd");

// 传入参数
lua_pushnumber(L, x);
lua_pushnumber(L, y);

// 调用函数,运行
lua_pcall(L, 2, 1, 0);
int nSum = 0;
if(lua_isnumber(L, -1) == 1)
{
nSum = lua_tonumber(L, -1);
}
return nSum;
}</span>

       在本节展示了用在C++上调用lua脚本函数。在下一节,将介绍一个第三方库,我们现在C++上写函数,然后在lua中调用此函数,最后在C++中调用这个lua函数。(感觉挺绕的)