파이썬에서 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와 라이브러리를로드 할 때. 나는 어떤 성공도없이 여러 가지를 시도했고, 나는이 시점에서 꽤 붙어있다.
감사합니다. 그건 제가 시도한 것 중 하나입니다. 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 –
글쎄,''-fPIC'로'.o'를 컴파일하고'.그래서 당신이 의존하는 도서관에 대해 "제가 배운 기술입니다. 추가 정보없이 잘못된 것을 진단 할 수 없습니다. 죄송합니다. –