2010-04-09 2 views
4

파이썬에서 ctypes를 통해 호출하고 싶은 함수가 포함 된 라이브러리를 C로 작성하고 있습니다.파이썬 ctypes 및 동적 연결

나는이 성공적으로 다른 라이브러리를 수행했지만, 해당 라이브러리는 매우 바닐라 종속성을했다 (즉 fstream, math, malloc, stdio, stdlib). 내가 작업하고있는 다른 라이브러리에는 더 복잡한 종속성이 있습니다.

예를 들어 fftw3을 사용해 보겠습니다. 시험 삼아, 난 그냥이 포함 된 간단한 .cpp 파일을 컴파일하려고합니다 :

icpc -Wall -fPIC -c waveprop.cpp -o libwaveprop.o $std_link 
icpc -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop.so.1.0 libwaveprop.o 

cp waveprop.so.1.0 /usr/local/lib/ 
rm waveprop.so.1.0 
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so 
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so.1 

이 모든 작품 :

int foo() 
{ 
    void *p = fftw_malloc(sizeof(fftw_complex)*64); 
    fftw_free(p); 

    printf("foo called.\n"); 

    return 0; 
}   

내가로 컴파일합니다. 지금은 포함 된 다른 .cpp 파일을 테스트 :

int main() 
{ 
    foo(); 
} 

결과 : 완전히 합리적이다

icpc test.cpp -lwaveprop 
/lib/../lib64/libwaveprop.so: undefined reference to `fftw_free' 
/lib/../lib64/libwaveprop.so: undefined reference to `fftw_malloc' 

합니다. 다음 번 시도 :

icpc test.cpp -lwaveprop -lfftw3 
./a.out 
foo called. 

위대한!

>>> from ctypes import * 
>>> print cdll.LoadLibrary('/usr/local/lib/libwaveprop.so.1') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib64/python2.6/ctypes/__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: /usr/local/lib/libwaveprop.so.1: undefined symbol: fftw_free 

그래서이 같은 문제입니다,하지만 난 아무 생각이 어떻게하는 ctypes을 위해 그것을 해결되지해야 :하지만 지금은하는 ctypes와 라이브러리를로드 할 때. 나는 어떤 성공도없이 여러 가지를 시도했고, 나는이 시점에서 꽤 붙어있다.

답변

0

libwaveprop.so 자체를 fftw3 라이브러리에 연결해야합니다. 그렇지 않으면 파이썬은 단순히 누락 된 기호를 가져올 곳을 알 수 없습니다. 마음 읽기는 어떤 프로그래밍 언어로도 구현되지 않습니다.

+0

감사합니다. 그건 제가 시도한 것 중 하나입니다. ICPC -shared -Wl, -soname, libwaveprop.so.1 -o libwaveprop.so.1.0 -lfftw3 및 -shared -Wl, -soname, libwaveprop.so.1 -o libwaveprop ICPC libwaveprop.o .so.1.0 libwaveprop.o 모두 같은 오류를 제공합니다 : LD를 : /usr/local/lib/libfftw3.a(malloc.o) : '기호'fftw_kernel_malloc에 ​​대한 재배치 R_X86_64_PC32을 A가 공유 할 때 사용할 수 없습니다 목적; -fPIC로 다시 컴파일하십시오. ld : 최종 링크 실패 : 잘못된 값 어떻게해야할지 모르겠습니다. 어떤 아이디어? 감사합니다, -nick –

+0

글쎄,''-fPIC'로'.o'를 컴파일하고'.그래서 당신이 의존하는 도서관에 대해 "제가 배운 기술입니다. 추가 정보없이 잘못된 것을 진단 할 수 없습니다. 죄송합니다. –

4

확인해 주셔서 감사합니다.

이 작업을하려면 링크 할 때 종속성을 포함해야했습니다 (duh). 나는 이것을 시도했지만 에러가 발생했다. 따라서 이것을 수정하면 fftw를 '-fpic'으로 CPP 플래그로 다시 컴파일해야한다. 모든 작품은 지금.

icpc -Wall -fPIC -c waveprop.cpp -o libwaveprop.o $std_link 
icpc -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop.so.1.0 libwaveprop.o -lfftw3 

cp waveprop.so.1.0 /usr/local/lib/ 
rm waveprop.so.1.0 
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so 
ln -sf /usr/local/lib/waveprop.so.1.0 /usr/local/lib/waveprop.so.1 

감사 답장을 -nick