1. 程式人生 > >為lua編寫C庫

為lua編寫C庫

本文參考

https://blog.csdn.net/zhang197093/article/details/76400871

我一直是喜歡將各種庫揉成一團放在一個可執行檔案裡。一個sh編譯出來。

但是我看到朋友都喜歡將不同功能的庫分別編譯成so,在lua中require。

我也來學習一下這種做法。

<font color="#000000">轉載註明http://www.liveslives.com</font>

首先參照上面的博文,編寫C庫程式碼。

我寫了一個叫 Wrap的模組。

#include"lauxlib.h"



static int Max(lua_State* L)
{
    int a=lua_tointeger(L,1);
    int b=lua_tointeger(L,2);
    if(a>b)
    {
        lua_pushboolean(L,1);
    }
    else
    {
        lua_pushboolean(L,0);
    }
    return 1;
}

static const struct luaL_Reg funcs[]=
{
    {"Max",Max},
    {NULL,NULL}
};

int luaopen_cWrap(lua_State* L)
{
    luaL_register(L,"Wrap",funcs);
    return 1;
}

然後gcc編譯成so。

gcc -fPIC -c Wrap.c -I./../../Depends/lua-5.1.4/
gcc -shared Wrap.o ./liblua.so -o cWrap.so

這裡需要lua的so,所以首先來編譯lua的so。

gcc lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lua.c luac.c lundump.c lvm.c lzio.c print.c -fPIC -shared -o liblua.so

我不懂makefile,所以我一直寫sh裡面呼叫gcc。

轉載註明http://www.liveslives.com https://blog.csdn.net/huutu

編譯好之後,把cWrap.so liblua.so 拷貝到lua目錄。

然後編寫lua指令碼測試。

print("hello module")
print(package.cpath)

local Wrap=require "cWrap"
local tmpRet=Wrap.Max(5,3)
print("tmpRet:" .. tostring(tmpRet))

 這種方式挺好的,但是在我的專案裡不怎麼合適。

因為我是直接把lua編譯到我的可執行檔案裡。

如果用本文方式,我又需要多幾個so檔案。

感覺挺麻煩的。