#lua #ffi #luajit
#lua #ffi #luajit
Вопрос:
Возможно ли загружать более одной библиотеки одновременно с помощью ffi.load в LuaJIT?
Может ли что-то подобное работать?
local ffi = require("ffi")
local bor = require("bit").bor
ffi.cdef([[
// C bindings from each library!
]])
return ffi.load(bor("lib1", "lib2", "lib3"))
Ответ №1:
На самом деле вы не можете импортировать несколько библиотек в один userdata из-за того, как работает библиотека LuaJIT FFI. Единственное, что вы можете легко сделать, это вызвать userdata getter в защищенном вызове, поскольку LuaJIT FFI выдает ошибку для неопределенного символа и перебирает каждую библиотеку, которую вы хотите извлечь.
local function get(t, k)
return t[k]
end
local superlib = setmetatable({
ffi.load "a",
ffi.load "b",
ffi.load "c"
}, {
__index = function (self, k, v)
for _,l in ipairs(self) do
local status, val = pcall(get, l, k)
if status then
return val
end
end
end
})