Lua脚本调用C共享库的最佳方法是什么?

时间:2010-11-12 06:25:14

标签: lua

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

我听说过“Alien”(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函数”......我只是希望我可以调用共享库这是盒子上的“标准”。

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

由于

林顿

2 个答案:

答案 0 :(得分:4)

Lua不能开箱即用地调用C库。它不随libffi一起提供,因此不像ctypes那样工作。

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

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

答案 1 :(得分:4)

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

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

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

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