2012-10-28 47 views
1

這工作:連接一個Python模塊:區別與'ld`鏈接之間以及與`cc`

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 

爲什麼?這兩種方法有什麼區別嗎?有什麼不同?

回答

1

這兩種情況下對象文件和庫的順序是不一樣的。訂單很重要。

+1

謝謝。 'ld -lpython2.7 leveldb _ *。o -lleveldb -lsnappy -lc -o leveldb.so -shared'工作。 – Albert

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/。 (免責聲明:我是作者。)

相關問題