2010-11-12 10 views
5

Vengo da più di uno sfondo Python e CTYPES ... e sto cercando di trovare il modo migliore per chiamare una lib di C condivisa standard dallo script Lua.Il modo migliore per lo script Lua di chiamare una lib di C condivisa?

Ho sentito parlare di "Alien" (http://alien.luaforge.net/), ma non sono sicuro di quanto sia attuale? Significato è aggiornato regolarmente?

Ad esempio, so che questa è una libreria Lua SQLite ma diciamo che volevo chiamare la lib di SQLite che viene creata quando compilo SQLIte?

Così, per esempio: Nel mio caso il lib è in /usr/local/lib/libsqlite3.so

Se scrivo un piccolo script fittizio solo per vedere se è possibile caricare il lib

require "libsqlite3" 

print "hello" 

ottengo il seguente errore:

[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$ 

questo vuol dire che Lua non può chiamare librerie condivise "fuori dagli schemi" e che devo usare qualcosa come Alien?

So che posso anche codificare il lib condivisa in modo tale che esso include i file di intestazione Lua e posso fare "Funzioni Lua" ... ero solo sperando ho potuto chiamare librerie condivise che sono "di serie " sulla scatola.

e aiutare o consigliare sarebbe molto apprezzato ;-)

Grazie

Lynton

risposta

4

Lua non si può chiamare librerie C fuori dalla scatola. Non viene fornito con libffi e, come tale, non funziona come ctypes.

Storicamente, lua è incorporato in un'applicazione che a sua volta aggiungerà alle tabelle lua le funzioni necessarie e fornirà la manipolazione dello stack lua per passare e restituire i parametri.

Alien è un adattamento libffi e funzionerà.

+0

Sai se Alien è ampiamente utilizzato nella produzione? Presumo che sia solido come Python CTYPES? –

+0

L'ho esaminato, e sembra che anche i ctype Python utilizzino libffi, che è quello che Alien usa in Lua.Pertanto, dovrebbe essere "rock solido" come ctypes Python :) –

4

Come ha detto Yann, Lua non può chiamare le librerie C per impostazione predefinita. La prassi abituale è quella di esporre l'API desiderata mediante la creazione di una libreria di rilegatura. Esistono diversi luoghi in cui è possibile cercare i binding di librerie esistenti per Lua, ad esempio the wiki, LuaRocks o LuaDist.

Se non esistono collegamenti, è possibile provare a utilizzare Alien per collegarsi direttamente alle librerie C utilizzando libffi.

Per il vostro esempio - Sqlite3, ci sono almeno 2 attacchi:

  • SQL generico vincolante - LuaSql, fornisce il legame con Sqlite3, MySQL, Oracle ...
  • specializzata vincolante - Lua-Sqlite3
+0

Grazie per i commenti, molto apprezzato ;-) –

Problemi correlati