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++
- linux c程式呼叫lua程式碼的例項LinuxC程式
- xLua中C#呼叫LuaC#
- xLua中Lua呼叫C#C#
- C++呼叫Lua API介面C++API
- C中呼叫Lua函式函式
- Lua 和 C/C++ 互相呼叫例項分析C++
- toLua中Lua呼叫C#中的類C#
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- 深入xLua實現原理之Lua如何呼叫C#C#
- 深入xLua實現原理之C#如何呼叫LuaC#
- 透過例子學習Lua(7)--呼叫C/C++函式(轉)C++函式
- 原生實現C#和Lua相互呼叫-Unity3D可用C#Unity3D
- Unity3D 預備知識:C#與Lua相互呼叫Unity3DC#
- Cocos2d-x下Lua呼叫自定義C++類C++
- C程式函式呼叫&系統呼叫C程式函式
- 從 C/C++ 程式呼叫 Java 程式碼C++Java
- 【程式語言】C/C++中如何使用Lua指令碼C++指令碼
- Unity3D熱更新之LuaFramework篇[05]--Lua指令碼呼叫c#以及如何在Lua中使用DotweenUnity3DFramework指令碼C#
- 使用自定義lua解析管理器呼叫lua指令碼中的table指令碼
- Lua常用C Api介面API
- android使用JNI呼叫C,C++程式AndroidC++
- 透過例子學習Lua(6)--C/C++中用Lua函式(轉)C++函式
- Nginx+lua 實現呼叫.so檔案Nginx
- C# 呼叫Python程式碼C#Python
- C#/.net程式呼叫pythonC#Python
- Swift如何呼叫Objective-C程式碼SwiftObjectC程式
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- Lua封裝函式模組並由其他模組呼叫封裝函式
- 匯出 C/C++ API 給 Lua 使用[轉]C++API
- 透過例子學習Lua(5)--Lua與C的互動(轉)
- C#程式呼叫FFmpeg操作音視訊C#
- windows下C++如何呼叫matlab程式WindowsC++Matlab
- 〈詳解〉Python3呼叫C程式PythonC程式
- C與彙編程式的約定呼叫
- 透過例子學習Lua(4)--函式的呼叫(轉)函式
- C++呼叫C介面C++
- Java如何呼叫C語言程式,JNI技術JavaC語言