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...