在上一节中,讲述了如何产生一个lua的静态链接库,在这一节,将讲述简单使用lua5.1.lib的过程。
首先先建立一个新的win32 Console Application,在新工程里,为了美观,我将默认生成的文件夹删除,建立了include和src两个文件夹。在根目录下建立了三个文件夹:lib,script,include。
将上节生成的lua5.1.lib放入lib文件夹,将lua源码中的lauxlib.h,lua.h,luaconf.h,lualib.h拷贝到include文件夹。
在VS上,将根目录中include中的四个头文件加载到include中。在src中建立AMLua.h,AMLua.cpp,AMMain.cpp三个文件。
下面在项目属性页进行一些必要设置,包含依赖项,库路径等。
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函数。(感觉挺绕的)