这有效:
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
为什么呢?这两种方法有什么区别吗?有什么区别?
答案 0 :(得分:1)
两种情况下目标文件和库的顺序不同。订单很重要。
答案 1 :(得分: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/。 (免责声明:我是作者。)