Lua kommt mit einer kostenlosen Online reference manual für Version 5.2 (die ich verwende) und Programming in Lua für Version 5.0 ist ebenfalls verfügbar.Einbetten von Lua 5.2 und Definieren von Bibliotheken
Es gab jedoch ein paar Änderungen zwischen diesen Versionen, die ich nicht übertreffen kann. Die Änderungen sind in den aufeinander folgenden Versionen des Referenzhandbuchs für 5.2 und 5.1 vermerkt. Beachten Sie die sukzessive Einstellung von luaL_openlib()
zugunsten von luaL_register()
, dann luaL_register()
zugunsten von luaL_setfuncs()
.
Die Suchen im Internet ergeben gemischte Ergebnisse, wobei die meisten auf luaL_register()
verweisen.
Was ich versuche, durch das Mini-Programm zusammengefasst werden kann zu erreichen, unter dem und mit etwa verknüpfte erstellt werden kann, gcc ./main.c -llua -ldl -lm -o lua_test
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
#include <string.h>
static int test_fun_1(lua_State * L)
{
printf("t1 function fired\n");
return 0;
}
int main (void)
{
char buff[256];
lua_State * L;
int error;
printf("Test starts.\n\n");
L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "t1", test_fun_1);
while (fgets(buff, sizeof(buff), stdin) != NULL)
{
if (strcmp(buff, "q\n") == 0)
{
break;
}
error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||
lua_pcall(L, 0, 0, 0);
if (error)
{
printf("Test error: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
}
lua_close(L);
printf("\n\nTest ended.\n");
return 0;
}
Dies funktioniert wie erwartet und t1()
Eingabe erzeugt das erwartete Ergebnis.
Ich möchte jetzt eine Bibliothek/Paket für Lua sichtbar erstellen. Die Programming in Lua Ratschläge uns to use ein Array und eine Ladefunktion:
static int test_fun_2(lua_State * L)
{
printf("t2 function fired\n");
return 0;
}
static const struct luaL_Reg tlib_funcs [] =
{
{ "t2", test_fun_2 },
{ NULL, NULL } /* sentinel */
};
int luaopen_tlib (lua_State * L)
{
luaL_openlib(L, "tlib", tlib_funcs, 0);
return 1;
}
dann luaopen_tlib()
nach luaL_openlibs()
verwenden. Auf diese Weise können wir tlib:t2()
verwenden, wenn wir LUA_COMPAT_MODULE
definieren (im kompatiblen Modus arbeiten).
Was ist der richtige Weg, dies in Lua 5.2 zu tun?
Die luaL_openlibs ist optional und sollte wahrscheinlich nicht da sein (für das Beispiel). – Cubic
Ich habe das Beispiel so bearbeitet, dass nur die wichtige Zeile angezeigt wird. – prapin