1. 程式人生 > 其它 >Lua呼叫C++動態連結庫.so

Lua呼叫C++動態連結庫.so

c++程式碼// testlib.cpp

#include <iostream>
#include <lua.hpp>
using namespace std;

/* 定義C++的Average 函式 */
int average(lua_State *L)
{
    int num = lua_gettop(L);  //獲取引數個數

    double sum = 0;
    double avg = 0;

    for(int i = 1; i <= num; i++)   //注意Lua棧下標從1開始
    {
        sum += lua_tonumber(L, i);  //
求和 } avg = sum / num; //求平均 lua_pushnumber(L, avg); //平均值入棧 lua_pushnumber(L, sum); //和入棧 int size = lua_gettop(L); for(int i=1;i<=size;i++) { printf("[%d] = %f\n",i, lua_tonumber(L, i)); } return 2; //return 返回值個數 } /* 定義C++的sub函式 */ int sub(lua_State *L) {
int num = lua_gettop(L); if(num != 2) { cout << "Input param number is not correct!" << endl; return 0; } int a = lua_tonumber(L, 1); //獲取第一個引數,被減數 int b = lua_tonumber(L, 2); //獲取第二個引數,減數 int diff = a - b; lua_pushnumber(L, diff); //結果壓入棧 return
1; } /* 定義C++的add函式 */ int add(lua_State *L) { int num = lua_gettop(L); if(num != 2) { cout << "Input param number is not correct!" << endl; return 0; } int a = lua_tonumber(L, 1); //獲取第一個引數,被減數 int b = lua_tonumber(L, 2); //獲取第二個引數,減數 int sum = a + b; lua_pushnumber(L, sum); //結果壓入棧 return 1; } //使用luaL_Reg註冊新的C函式到Lua中 static const luaL_Reg test_functions[] = { {"average", average}, {"add", add}, {"sub", sub}, {NULL, NULL} //陣列中最後一對必須是{NULL, NULL},用來表示結束 }; /* luaopen_XXX,XXX為庫名稱,若庫名稱為testlib.so,XXX即為testlib */
//luaopen_testlib函式前要加上 extern "C" 匯出函式名才能被lua呼叫
//要不然在lua require的時候會報錯找不到luaopen_testlib
extern "C" int luaopen_testlib(lua_State *L) { luaL_newlib(L, test_functions); //Lua 5.2之後用luaL_newlib代替了luaL_register return 1; }

makefile

testlib.so: testlib.h testlib.cpp
	g++ -std=c++11 -shared -fPIC testlib.cpp -o testlib.so -I /usr/local/include/lua -llua -ldl
clean:
	rm -f testlib.so

注:

-I /usr/local/include/lua     --->   指明要連結的lua標頭檔案的路徑

在執行make命令之前需要利用lua原始碼編譯出靜態庫(.a)或者動態庫(.so)放在同級目錄下,
要不然在執行make編譯testlib.so時會報很多lua介面函式找不到

lua呼叫

local abc = require("testlib")
 
avg,sum = abc.average(100, 200, 300, 400, 500)
diff = abc.sub(100,50)
total = abc.add(100,50)
 
print("avg = ",avg)
print("sum =",sum)
print("diff = ",diff)
print("total = ",total)