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

为什么?这两种方法有什么区别吗?有什么区别?

4

2 回答 2

1

两种情况下目标文件和库的顺序不同。顺序很重要。

于 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/plyvelhttps://plyvel.readthedocs.org/。(免责声明:我是作者。)

于 2012-12-10T23:47:34.420 回答