2011-12-02 8 views
5

私は、いくつかのluaファイルに依存するpythonプロジェクトを持っています。私はpython 2.7からluaファイルを要求しようとすると、socket.core "undefined symbol:lua_getmetatable"をロードする際にエラーが発生します。リンカエラーLunatic Python lua.require( 'socket') - >未定義シンボル:lua_getmetatable

シンプル再生:

$ python 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import lua 
>>> lua.require('socket') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
Exception: error: error loading module 'socket.core' from file 
    '/usr/lib/lua/5.1/socket/core.so': 
    /usr/lib/lua/5.1/socket/core.so: undefined symbol: lua_getmetatable 

私はメインを使用している場合、私は同じエラーを取得し、私はPy_ssize_t型の警告をクリーンアップrecent Lunatic Python branchを使用して、とUbuntu 11.04

のliblua5.1-socket2ていますlunatic-pythonのソースコードを入手し、luasocket 2.0.2にアップグレードしてください。

編集:このエラーの原因とは何ですか。どのように修正できますか?

編集#2:これはluasocket-2.0.2をビルドしたときの出力です。デフォルトのメイクはunix.so構築していなかった、と私は2.0.2と混合し、一致2.0.0なかったようにもいることを構築し、それを編集した:

$ make 
cd src; make all 
make[1]: Entering directory `/sandbox/luasocket/luasocket-2.0.2/src' 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o luasocket.o luasocket.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o timeout.o timeout.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o buffer.o buffer.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o io.o io.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o auxiliar.o auxiliar.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o options.o options.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o inet.o inet.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o tcp.o tcp.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o udp.o udp.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o except.o except.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o select.o select.c 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o usocket.o usocket.c 
gcc -O -shared -fpic -o socket.so.2.0.2 luasocket.o timeout.o buffer.o io.o auxiliar.o options.o inet.o tcp.o udp.o except.o select.o usocket.o 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o mime.o mime.c 
gcc -O -shared -fpic -o mime.so.1.0.2 mime.o 
gcc -I/usr/include/lua5.1 -DLUASOCKET_DEBUG -pedantic -Wall -O2 -fpic -llua -c -o unix.o unix.c 
gcc -O -shared -fpic -o unix.so buffer.o auxiliar.o options.o timeout.o io.o usocket.o unix.o 
make[1]: Leaving directory `/sandbox/luasocket/luasocket-2.0.2/src' 
+0

質問は何ですか? ;) – 0xC0000022L

+1

このエラーの原因は何ですか。どのように修正できますか? – RedCup

+0

'lua'モジュールからシンボルが正しくエクスポートされていないため、必要なモジュールで使用することができません。また、コンパイル段階のログ、主に最終的なリンク部分を投稿できますか? –

答えて

6

問題はluasocketではありませんが、共有ライブラリのシンボルが処理されるようになります。

問題が​​にしばらくlua.so(Pythonモジュール)リンク、requireによってロードされた共有モジュールは​​からシンボルへのアクセスを持っていないということです。 Mac OS Xでは、dlopenのシンボルがデフォルトでRTLD_GLOBALとしてロードされるため、これが機能します。時間requireによってlua.soから呼び出されたので、私はLuaのソース(lua-5.1.4/src/loadlib.c:69)を変更して実験してきた

は、しかし、それは助けにはならない、​​からのシンボルは、すでにlua.soのためにローカルにロードされています。そのため、luasocketには表示されません。

幸いにも、Pythonはsysモジュールを使ってdlopenセマンティクスを変更することができます。これにより、正確に何が必要なのかを、RTLD_GLOBALのモジュールを強制的にロードすることができます。次のコードを実行して、問題なく動作するかどうかを確認してください:

$ python 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys, DLFCN 
>>> sys.setdlopenflags(DLFCN.RTLD_NOW | DLFCN.RTLD_GLOBAL) 
>>> import lua 
>>> lua.require("socket") 
<Lua table at 0x22ccef0> 
+0

うわー...すばらしい説明もありがとう。不思議なことに、ldloadの詳細については、「man ldload」と「sysモジュールのPythonドキュメント」(http://docs.python.org/library/sys.html)を参照してください。 sys.setdlopenflags(n)はUNIXのみです。 – RedCup

+0

私はpythonの代わりにlua側を除いて同様の問題に遭遇しています。私は '-export-dynamic'で狂気を再構築しようとしました。それは、それが依存しているシンボルが後でロードされた後続のモジュールで見えるようになるためです。好奇心のために、なぜこの問題は窓で起こりませんか? – greatwolf

関連する問題