在上一节中,讲述了如何产生一个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函数。(感觉挺绕的)