2012-10-28 2 views
1

`로 :파이썬 모듈을 연결 : 차이를 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에 컴파일러 및 링커가 귀하의 질문에 하나 같이 문제를 피하고, 적절한 플래그로 호출됩니다 확인합니다.

Btw, 당신은 LevelDB를위한 훌륭한 파이썬 API를 원한다면 Plyvel을 봐야합니다. 자세한 내용은 https://github.com/wbolster/plyvelhttps://plyvel.readthedocs.org/을 참조하십시오. (부인 : 저는 저자입니다.)