lua呼叫c程式

MarkallDown發表於2020-11-13

Introduction

鑑於lua5.4版本取消了luaL_register之後,網上教程的混亂,這裡以5.4版本為例,用luaL_setfuncs來代替。

Results

完整C程式碼

程式碼如下:

#ifdef __cplusplus
extern "C" {
#include <lua.hpp>
#include <lualib.h>
#include <lauxlib.h>
#include <luaconf.h>
}
#else
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <luaconf.h>
#endif

#include <string.h>
#include <stdio.h>

extern "C" int add(lua_State*L)
{
	double p1 = luaL_checknumber(L, 1);
	double p2 = luaL_checknumber(L, 2);
	lua_pushnumber(L, p1 + p2);
	return 1;
}

extern "C" int sub(lua_State*L)
{
	double p1 = luaL_checknumber(L, 1);
	double p2 = luaL_checknumber(L, 2);
	lua_pushnumber(L, p1 - p2);
	return 1;
}

static const luaL_Reg mylibs[] = 
{
	{"add", add},
	{"sub", sub},
	{NULL, NULL}
};

extern "C" __declspec(dllexport)

int luaopen_mytestlib(lua_State *L)
{
	lua_newtable(L);
	luaL_setfuncs(L, mylibs, 0);
	return 1;
}

受到文章[2]的啟發,作者提到luaL_setfuncs函式最後一個引數的意思是告訴lua相關的引數位置,所以這裡因為沒有push,所以設為0才對。另外,需要新增額外一行lua_newtable(L);

C程式碼

LUALIB_API int luaopen_mytest(lua_State * L) {
    lua_newtable(L);
    /*register function no upvalue*/
    luaL_setfuncs(L, no_upvalue_func, 0);

    /*set two upvalue */
    lua_pushnumber(L,100);
    lua_pushstring(L,"i am upvalue");
    /*register function with two upvalue*/
    /*push了兩個upvalue值所以第三個引數是2*/
    luaL_setfuncs(L, with_upvalue_func, 2);
    return 1;
}

以下為working的時候,引數為0
在這裡插入圖片描述
當引數值為2時候,執行不正確
在這裡插入圖片描述
這應該和python wrapper出錯的道理一樣,是引數給定的問題。

lua程式碼

local mytest = require "mytestlib"

print (mytest.add(1.0,2.0))
print (mytest.sub(1.0,2.0))

部分visual studio設定
在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

References

[1]. https://www.cnblogs.com/orangeform/archive/2012/07/23/2469902.html
[2]. https://www.cnblogs.com/cheerupforyou/p/7192307.html

相關文章