LuaJIT 的 ffi.load 可以加载多个库吗?

能否使用 LuaJIT 的 ffi.load 一次性加载多个库呢?

类似以下代码是否可行:

local ffi = require("ffi")
local bor = require("bit").bor
ffi.cdef([[
   // 每个库的 C 绑定!
]])
return ffi.load(bor("lib1", "lib2", "lib3"))
点赞
用户5166433
用户5166433

由于 LuaJIT FFI 库的工作方式,您不能将多个库导入到单个 userdata 中。 唯一可以轻松完成的是在受保护的调用中调用 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
})
2020-10-02 19:38:29