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
在這裏插入圖片描述
結果如圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章