Slua集成第三方库(一)

材料

Slua1.6.2:https://github.com/pangweiwei/slua/releases/tag/1.6.2

环境

window10_64bit

开始

Slua1.6.2解压之后的文件夹内容如图:
在这里插入图片描述
Assets文件夹存放我们build之后的Slua文件,这个文件夹下的内容要拷贝到Unity的Assets中供Unity编译调用,其中内容如图
在这里插入图片描述

设置编译环境

Slua的编译主要在文件夹build中进行,build文件夹内容如图
在这里插入图片描述

  • 首先我们要把集成的三方文件统一放到一个文件夹下,方便管理,这里在build文件夹下新建一个文件夹3rd用来存放需要集成的第三方源文件
  • 3rd文件夹下新建一个C语言的头文件命名为“all3rd.h”,用来统一管理注册该文件夹下所有的源文件,再新建一个luatest.c源文件作为我们要扩展的第三方库,3rd文件夹下的文件都要作为lib注册到slua中(这一步后面讲),all3rd.h,luatest.c的代码分别如下所示:


#define COMPILE_3RD   //定义COMPILE_3RD,用来在slua.c中判定是否编译第三方源文件
#ifdef COMPILE_3RD

#ifndef SLUA_3RD_LOADED
#define SLUA_3RD_LOADED

#include "luatest.c" //要测试的第三方源文件

#define EXTEND_LUA_LIB_MAP(XX) XX(luatest,luaopen_luatest)  //这里执行XX

static int luaopen_all3rd(lua_State *L)
{
	int top=lua_gettop(L); //获得栈顶值
#define XX(libname,opnefunc) (opnefunc(L),lua_setglobal(L,#libname)) 
	 //这里XX的作用就是执行第三方库的开始方法
	//(执行luaopen_XXX函数)并将libname暴露给lua使用,lua_setglobal查看luaCAPI
	EXTEND_LUA_LIB_MAP(XX);
#undef XX
	lua_settop(L,top); //设置栈顶值
	return 0;
}
#endif //SLUA_3RD_LOADED
#endif //COMPILE_3RD
#include <stdio.h>
#include <string.h>
#if ((LUA_VERSION_NUM < 502) && (!defined(luaL_newlib)))//以防小于502版本的lua没有定义luaL_newlib
#  define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l))
#endif

static int Test1(lua_State *L) //自定义方法Test1供lua调用,作用:链接两个字符串
{
	char *oneParam=luaL_checkstring(L,1); //检测并得到Slua中调用Test1的第一个参数
	char *twoParam=luaL_checkstring(L,2);//检测并得到Slua中调用Test1的第二个参数
	lua_pushfstring(L,"%s+%s",oneParam,twoParam);//返回值压入栈
	return 1;//返回值个数
}
static int Test2(lua_State *L)//自定义方法,作用:计算两数之和
{
	double param1=luaL_checknumber(L,1);//检测并得到Slua中调用Test2的第一个参数
	double param2=luaL_checknumber(L,2);//检测并得到Slua中调用Test2的第一个参数
	lua_pushnumber(L,param1+param2);//返回值压入栈
	return 1;//返回值个数
}

static const struct luaL_Reg mylibs[]=//要注册方法数组
{
	{"Test1",Test1},
	{"Test2",Test2},
	{NULL,NULL},
};

int luaopen_luatest(lua_State *L) //入口方法,编译时由这里进入
{
	luaL_newlib(L,mylibs);//注册
	return 1;
}
  • 之后我们需要修改图中标记的两个文件,slua.c源文件和make_win_x64.bat批处理
    在slua.c文件中需要注册我们之前创建的all3rd.h(即注册我们的第三方库文件,以便在编译时把第三方库文件也编译进去),打开slua.c
    在这里插入图片描述
    在slua.c中添加头文件:#include “3rd/all3rd.h”在这里插入图片描述
    然后再找到 luaS_openextlibs方法,在这个方法中添加all3rd.h文件中的luaopen_all3rd方法,参数指针传入,添加如图标记的部分
    在这里插入图片描述
    至此,我们库文件的添加已经完成了
  • 编辑make_win_x64.bat
    因为slua.c文件是在“luajit-2.1.0-beta3/src”文件加下进行编译的,luajit的编译流程是先使用VS环境中的vcvars64.bat编译,然后再执行luajit的批处理msvcbuild.bat对文件进行编译,有兴趣可以研究研究,总之,我们要做的就是把build下要编译进slua.c(包括slua.c)的库,复制到“luajit-2.1.0-beta3/src”文件夹下进行编译
    在这里插入图片描述
    这个复制过程可以写成批处理,这也是编辑make_win_x64.bat的原因,打开make_win_x64.bat添加如下内容,作用:在“luajit-2.1.0-beta3/src”文件夹下创建3rd文件夹,并将“build/3rd/”文件夹下的内容全部拷贝到“luajit-2.1.0-beta3/src/3rd/”文件夹下
md %LUAJIT_PATH%\src\3rd
xcopy 3rd %LUAJIT_PATH%\src\3rd /s /h /d /y

做完以上步骤,双击执行make_win_x64.bat批处理,将Assets文件夹下的内容拷贝到Unity中
在这里插入图片描述

测试

Slua的lua文件中引入luatest
在这里插入图片描述
测试luatest中的自定义方法Test1,Test2
在这里插入图片描述
结果如图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值