2010-11-12 79 views
5

我来自更多的Python和CTYPES背景......并试图找出从Lua脚本调用标准C共享库的最佳方法。Lua脚本调用C共享库的最佳方式是什么?

我听说过“Alien”(http://alien.luaforge.net/),但我不确定它的电流是多少?意思是更新regulary?

例如,我知道他是一个SQLite Lua库,但我们可以说我想调用在编译SQLIte时创建的SQLite共享库?

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

如果我写了一个小的虚拟脚本,只是为了看看它是否能够加载的lib

require "libsqlite3" 

print "hello" 

我得到以下错误:

[email protected]:~/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 ? 
[email protected]:~/Desktop/SQLite Test$ 

这是否意味着Lua中不能调用共享库“开箱即用”,而我不得不使用一些像外星人?

我知道我也可以通过包含Lua头文件的方式对共享库进行编码,并且我可以制作“Lua函数”......我只是希望我可以调用共享库“standard “在箱子上。

并帮助或建议将不胜感激;-)

感谢

林顿

回答

4

的Lua不能调用C库开箱。它不附带libffi,因此不像ctypes那样工作。

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

外星人是一个libffi适应,将工作。

+0

你知道Alien是否被广泛用于生产?我认为它像Python的CTYPES一样坚如磐石? – 2010-11-12 08:30:50

+0

我看着它,似乎Python ctypes也使用libffi,这是Alien在Lua中使用的。因此,它应该像Python ctypes一样“坚如磐石”:) – 2010-11-12 16:03:26

4

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

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

对于你的榜样 - SQLITE3,至少有2绑定:

  • 通用SQL结合 - LuaSql,提供结合SQLITE3,MySQL和甲骨文...
  • 专业结合 - Lua-Sqlite3
+0

感谢您的评论,非常感谢;-) – 2010-11-12 12:28:10

相关问题