Основное использование заключается в следующем:
- Сгенерируйте заголовочный файл с помощью luajit
#include
этот заголовок в исходном файле (файлах), который будет ссылаться на его символы
- Скомпилируйте исходный код в работающий исполняемый или общий двоичный модуль для lua в зависимости от вашего варианта использования.
Вот минимальный пример для иллюстрации:
test.lua
return
{
fooprint = function (s) return print("from foo: "..s) end,
barprint = function (s) return print("from bar: "..s) end
}
test.h
// luajit -b test.lua test.h
#define luaJIT_BC_test_SIZE 155
static const char luaJIT_BC_test[] = {
27,76,74,1,2,44,0,1,4,0,2,0,5,52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15,
102,114,111,109,32,102,111,111,58,32,10,112,114,105,110,116,44,0,1,4,0,2,0,5,
52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15,102,114,111,109,32,98,97,114,
58,32,10,112,114,105,110,116,58,3,0,2,0,5,0,7,51,0,1,0,49,1,0,0,58,1,2,0,49,1,
3,0,58,1,4,0,48,0,0,128,72,0,2,0,13,98,97,114,112,114,105,110,116,0,13,102,
111,111,112,114,105,110,116,1,0,0,0,0
};
runtest.cpp
// g++ -Wall -pedantic -g runtest.cpp -o runtest.exe -llua51
#include <stdio.h>
#include <assert.h>
#include "lua.hpp"
#include "test.h"
static const char *runtest =
"test = require 'test'\n"
"test.fooprint('it works!')\n"
"test.barprint('it works!')\n";
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_getglobal(L, "package");
lua_getfield(L, -1, "preload");
// package, preload, luaJIT_BC_test
bool err = luaL_loadbuffer(L, luaJIT_BC_test, luaJIT_BC_test_SIZE, NULL);
assert(!err);
// package.preload.test = luaJIT_BC_test
lua_setfield(L, -2, "test");
// check that 'test' lib is now available; run the embedded test script
lua_settop(L, 0);
err = luaL_dostring(L, runtest);
assert(!err);
lua_close(L);
}
Это довольно прямолинейно. Этот пример берет байт-код и помещает его в таблицу package.preload
для среды lua этой программы. Затем другие сценарии lua могут использовать это, выполнив require 'test'
. Встроенный источник lua в runtest
делает именно это и выводит:
from foo: it works!
from bar: it works!
person
greatwolf
schedule
17.10.2013
luaL_loadstring
для загрузки этого массива C. После того, как вы вернете функцию в стек, вы можете выполнить ее с помощью чего-то вродеcall
илиpcall
или сохранить ее в таблицеpackage.preload
, если она понадобится вам позже — в зависимости от того, что вы хотите сделать. - person greatwolf   schedule 17.10.2013