c和lua的互相呼叫

2021-07-25 13:43:54 字數 3395 閱讀 6705

lua和c的互相呼叫(適用於mac os)

一、c呼叫lua

-------------------------------------test.c----------------------------------

#include

#include

#include

#include

lua_state* l;

int getadd(int x,int y)

int main(int argc,char** argv)

-------------------------------------add.lua---------------------------------

function add(x,y)

return x + y

end編譯:gcc ./test.c -i /usr/local/include/ -l /usr/local/lib/ -llua

生成a.out

執行a.out使用命令./a.out

(ps:在我本機上/usr/local/include/目錄下包含lauxlib.h,lua.h,lua.hpp,luaconf.h,lualib.h;/usr/local/lib/下包含liblua.a)

二、lua呼叫c

有兩種方式:

1、程式主體在c中執行,c函式註冊到lua中。c呼叫lua,lua呼叫c註冊的函式,c得到函式的執行結果。

2、程式主體在lua中執行,c函式作為庫函式供lua使用。

現在假設我們有兩個檔案:test.c和add.lua

1、------------------------------test.c----------------------------------------

#include

#include

#include

#include

// 介面必須遵循lua要求的形式,即typedef int (*lua_cfunction)(lua_state* l)

int add2(lua_state* l)

int sub2(lua_state* l)

const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";

int main(int argc,char** argv)

// 途徑2,呼叫.lua檔案

//lual_dofile(l,"add.lua");

lua_close(l);

return 0;

}--------------------如果通過途徑2呼叫,則add.lua的內容為-------------------

print(add2(1.0,2.0)) 

print(sub2(20.1,19))

途徑1和途徑2的編譯方式均為:

gcc ./test.c -i /usr/local/include/ -l /usr/local/lib/  -llua && ./a.out

(ps:在我本機上/usr/local/include/目錄下包含lauxlib.h,lua.h,lua.hpp,luaconf.h,lualib.h;/usr/local/lib/下包含liblua.a)

作用為編譯test.c為執行檔案a.out,期間需要使用-i包含使用的.h檔案,-l指定需要使用的lua庫的位置,-l後跟庫的名字(liblua.a需要去掉字首lib和字尾.a,只使用lua即可)

2、------------------------------test.c----------------------------------------

// 需要把main函式刪除,只留下可供lua使用的函式

#include

#include

#include

#include

// add2方法和sub2方法就不說了,同上

int add2(lua_state* l)

int sub2(lua_state* l)

//lual_reg結構體的第乙個欄位為字串,在註冊時用於通知lua該函式的名字。

//第乙個欄位為c函式指標。

//結構體陣列中的最後乙個元素的兩個欄位均為null,用於提示lua註冊函式已經到達陣列的末尾。

static lual_reg mylibs = ,,};

//該c庫的唯一入口函式。其函式簽名等同於上面的註冊函式。見如下幾點說明:

//1. 我們可以將該函式簡單的理解為模組的工廠函式。

//2. 其函式名必須為luaopen_***,其中***表示library名稱。lua**require "***"需要與之對應。

//3. 需要強調的是,所有需要用到"***"的**,不論c還是lua,都必須保持一致,這是lua的約定,

//   否則將無法呼叫。

int luaopen_mytestlib(lua_state* l)

--------------------------------add.lua---------------------------------

-- 會去呼叫c中的luaopen_***函式

require "mytestlib"

-- 在呼叫時,必須是package.function

print(mytestlib.add2(10,15))

print(mytestlib.sub2(15,10))

編譯方式:

gcc -c ./test.c -i /usr/local/include/

gcc -o2 -bundle -undefined dynamic_lookup -o mytestlib.so ./test.o 

lua add.lua

第一條包含/usr/local/include/下的lua標頭檔案生成test.o檔案

第二條通過test.o生成mytestlib.so(注意命名時不要命名為libmytestlib.so)

第三條執行lua

注意:遇到的坑

如果使用gcc test.c -o mytestlib.so -fpic -shared -i /usr/local/include/ -l /usr/local/lib/ -llua這行命令來生成mytestlib.so

執行lua add.lua

會產生錯誤:

lua: multiple lua vms detected

stack traceback:

[c]: in ?

[c]: in function 'require'

add.lua:2: in main chunk

[c]: in ?

原因是命令列中鏈結了/usr/local/lib/下的靜態庫liblua.a,執行lua時又鏈結,造成了衝突,沒有查出如何解決

Lua 和 C 互相呼叫

api有一系列的壓棧函式,為了將棧頂的lua值轉換成c值,我們為每種型別定義乙個對應的函式 void lua pushnil lua state l void lua pushboolean lua state l,int bool void lua pushnumber lua state l,d...

學習筆記 C 與lua互相呼叫

1.輸出lua指令碼內容 void start 2.自定義loader void start private byte myloader ref string filepath 3.載入變數 double a luaenv.global.get a 獲取到lua裡面的全域性變數 a print a ...

Lua 指令碼語言 與 C的互相呼叫

lua訪問c 將c的函式包裝成lua環境認可的函式 將包裝好的函式註冊到lua環境中 lua呼叫c函式時,c函式從棧中獲取引數,並將計算結果壓入棧,並返回壓入棧的結果的數量 從lua指令碼中呼叫c 函式,函式必須定義lua cfunction型別。格式如下 int lua cfunction lua...