【问题标题】:Best way for Lua script to call a C shared lib?Lua 脚本调用 C 共享库的最佳方式?
【发布时间】:2010-11-12 06:25:13
【问题描述】:

我更多地来自 Python 和 CTYPES 背景...并且正在尝试找出从 Lua 脚本调用标准 C 共享库的最佳方法。

我听说过“外星人”(http://alien.luaforge.net/),但不确定它的最新情况?意思是定期更新?

例如,我知道他们是一个 SQLite Lua 库,但假设我想调用我编译 SQLite 时创建的 SQLite 共享库?

例如:在我的情况下,lib 在 /usr/local/lib/libsqlite3.so 中

如果我写一个小脚本只是为了看看它是否可以加载 lib

require "libsqlite3"

print "hello"

我收到以下错误:

debian@debian:~/Desktop/SQLite Test$ lua sqlite_test.lua
lua: error loading module 'libsqlite3' from file '/usr/local/lib/lua/5.2/libsqlite3.so':
    /usr/local/lib/lua/5.2/libsqlite3.so: undefined symbol: luaopen_libsqlite3
stack traceback:
    [C]: in ?
    [C]: in function 'require'
    sqlite_test.lua:1: in main chunk
    [C]: in ?
debian@debian:~/Desktop/SQLite Test$ 

这是否意味着 Lua 不能“开箱即用”地调用共享库,而我必须使用 Alien 之类的东西?

我知道我也可以对共享库进行编码,使其包含 Lua 头文件,并且我可以制作“Lua 函数”...我只是希望我可以调用共享库是包装盒上的“标准”。

非常感谢您的帮助或建议;-)

谢谢

林顿

【问题讨论】:

    标签: lua


    【解决方案1】:

    Lua 无法直接调用 C 库。它不附带 libffi,因此不像 ctypes 那样工作。

    从历史上看,lua 被嵌入到一个应用程序中,该应用程序反过来会将所需的函数添加到 lua 表中,并提供 lua 堆栈操作以传递和返回参数。

    Alien 是一个 libffi 改编版本,可以使用。

    【讨论】:

    • 你知道Alien是否在生产中被广泛使用?我认为它像 Python CTYPES 一样坚如磐石?
    • 我查了一下,好像Python ctypes也用了libffi,这是Alien在Lua中使用的。因此,它应该像 Python ctypes 一样“坚如磐石”:)
    【解决方案2】:

    就像 Yann 说的,Lua 默认不能调用 C 库。通常的做法是通过创建绑定库来公开所需的 API。有几个地方可以查找现有的 Lua 库绑定,例如 the wikiLuaRocksLuaDist

    如果不存在绑定,您可以尝试使用Alien 直接绑定到使用 libffi 的 C 库。

    对于您的示例 - Sqlite3,至少有 2 个绑定:

    • 通用 SQL 绑定 - LuaSql,提供与 Sqlite3、MySQL、Oracle 的绑定...
    • 专业绑定 - Lua-Sqlite3

    【讨论】:

    • 感谢 cmets,非常感谢 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多