lua呼叫c程式
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
相關文章
- C++呼叫LuaC++
- xLua中C#呼叫LuaC#
- xLua中Lua呼叫C#C#
- toLua中Lua呼叫C#中的類C#
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- 深入xLua實現原理之Lua如何呼叫C#C#
- 深入xLua實現原理之C#如何呼叫LuaC#
- 原生實現C#和Lua相互呼叫-Unity3D可用C#Unity3D
- C程式函式呼叫&系統呼叫C程式函式
- Unity3D熱更新之LuaFramework篇[05]--Lua指令碼呼叫c#以及如何在Lua中使用DotweenUnity3DFramework指令碼C#
- C#/.net程式呼叫pythonC#Python
- C# 呼叫Python程式碼C#Python
- Lua常用C Api介面API
- 使用自定義lua解析管理器呼叫lua指令碼中的table指令碼
- Nginx+lua 實現呼叫.so檔案Nginx
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- C#程式呼叫FFmpeg操作音視訊C#
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- C++呼叫C介面C++
- [轉]Cocos2d-x下Lua呼叫自定義C++類和函式的最佳實踐C++函式
- Java如何呼叫C語言程式,JNI技術JavaC語言
- 組合語言-019(彙編程式與c\c++相互呼叫)組合語言C++
- Python呼叫C/C++方式PythonC++
- Linux C/C++呼叫mongDBLinuxC++
- C#呼叫IronPython動態執行Python程式碼C#Python
- Lua封裝函式模組並由其他模組呼叫封裝函式
- C# 客戶端程式呼叫外部程式的三種實現C#客戶端
- C#呼叫PythonC#Python
- C#呼叫pydC#
- C#呼叫 C++的DLLC#C++
- c與c++的相互呼叫C++
- 熱更學習筆記10~11----lua呼叫C#中的List和Dictionary、擴充類中的方法筆記C#
- 新姿勢!Redis中呼叫Lua指令碼以實現原子性操作Redis指令碼
- 快速入門Redis呼叫Lua指令碼及使用場景介紹Redis指令碼
- C和Go相互呼叫Go
- c# 反射呼叫方法C#反射
- Python與C/C++呼叫之ctypesPythonC++
- C++呼叫 c#生成的dllC++C#