1

これは機能します:

cc leveldb_ext.cc leveldb_object.cc -o leveldb.so -I /usr/include/python2.7 -lpython2.7 -lleveldb -lsnappy -shared -lc

これは動作しません:

cc -I /usr/include/python2.7 -g -c leveldb_ext.cc leveldb_object.cc
ld -shared -o leveldb.so -lpython2.7 -lleveldb -lsnappy leveldb_ext.o leveldb_object.o -lc

どちらの場合も、コンパイラ/リンクエラーは発生しません。ただし、インポートしようとすると、次のエラーが発生します。

$ python -c "import leveldb"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: ./leveldb.so: undefined symbol: _ZNK7leveldb6Status8ToStringEv

なんで?2つの方法に違いはありますか?違いはなんですか?

4

2 に答える 2

1

オブジェクトファイルとライブラリの順序は、2つのケースで同じではありません。順序は重要です。

于 2012-10-28T21:21:49.197 に答える
0

通常、setup.pyスクリプトを使用してPythonモジュールをコンパイルします。このようなものが機能するはずです:

from setuptools.extension import Extension

ext_modules = [
    Extension(
        'yourmodule',
        sources=['yourmodule.c'],
        libraries=['a', 'b', 'c'],
        extra_compile_args=['-Wall', '-g'],
    )
]

setup(..., ext_modules=ext_modules)

Setuptoolsは、コンパイラとリンカが正しいフラグで呼び出されることを確認し、質問のような問題を回避します。

ところで、LevelDB用の優れたPython APIが必要な場合は、Plyvelを確認する必要があります。詳細については、 https://github.com/wbolster/plyvelおよびhttps://plyvel.readthedocs.org/を参照してください。(免責事項:私は著者です。)

于 2012-12-10T23:47:34.420 に答える