2014-01-23 75 views
2

我正在嘗試創建一個C模塊以便從lua腳本中調用。我正在研究Debian Linux。我正在使用mysql-proxy和lua 5.2。我已經創建(從教程中複製)一些要調用的示例函數。加載模塊未定義符號時出錯:luaL_setfuncs

裝載機的定義是這樣的:

int luaopen_luacall(lua_State* l) 
{ 

    luaL_newlibtable(l, luacall); 
    luaL_setfuncs(l, luacall, 0); 
    return 1; 
} 

從LUA調用此我使用此代碼:

luacall = require("luacall") 
local f = luacall.fun1() 

我已經使用這個命令編譯它:

g++ -shared -Wl,-E,-soname,libluacall.so -o luacall.so luacall.c -fPIC -llua -ldl 

當我嘗試運行腳本時,在require命令上出現以下錯誤:

error loading module 'luacall' from file '/usr/lib/mysql-proxy/lua/luacall.so': 
     /usr/lib/mysql-proxy/lua/luacall.so: undefined symbol: luaL_setfuncs 

我真的迷失在我做錯的事上。

+4

您確定正在運行Lua 5.2嗎?我不是指你在g ++中鏈接到的庫,我的意思是你在哪裏運行腳本來執行'require'? – Alex

+0

我已經卸載Lua 5.1。我在系統上唯一的LUA二進制文件是Lua 5.2。我不太清楚調用mysql-proxy的方式或方式。我試圖包含命令print'(「VERSION」,lua_version())',但我得到一個錯誤'嘗試調用全局'lua_version'(一個零值)'' – jordi

+0

'lua -v'打印什麼? – lhf

回答

3

我想我發現了問題(還沒有解決方案):Mysql代理在內部運行一個embended lua庫。

mysql-proxy -V 

給出的結果

mysql-proxy 0.8.1 
    chassis: mysql-proxy 0.8.1 
    glib2: 2.30.2 
    libevent: 2.0.19-stable 
    LUA: Lua 5.1.4 
    package.path: /usr/lib/mysql-proxy/lua/?.lua 
    package.cpath: /usr/lib/mysql-proxy/lua/?.so 
-- modules 
    admin: 0.8.1 
    proxy: 0.8.1 

所以我跑錯了Lua版本。我認爲這解釋了luaL_setfuncs錯誤。我已經看到,即使0.8.4版本包含這個版本的lua,所以我將不得不重寫C庫。

模塊的最終代碼結束這樣的(和運行!!!):

static const struct luaL_Reg my_luacall[] = { 
    {"trasnquery", trasnquery}, 
    {"fun2", function_2}, 
    {NULL, NULL} 
}; 

int luaopen_luacall(lua_State* l) 
{ 
    luaL_register(l, "luacall", my_luacall); 
    return 1; 
} 
4

構建Lua模塊時不要使用-llua。 Lua解釋器本身已經與liblua鏈接,並在模塊加載時滿足這些符號。鏈接您的模塊與liblua是與解釋器衝突。

相關問題