Python的ctypes和动态链接
问题描述:
我正在写一些库,其中包含我想通过ctypes从Python调用的函数。Python的ctypes和动态链接
我做这个成功的另一个库,但该库只有非常香草依赖(即fstream
,math
,malloc
,stdio
,stdlib
)。我正在处理的其他库具有更复杂的依赖关系。例如,我会尝试使用fftw3
。作为测试,我就尝试编译一个简单的.cpp
文件,其中包含:
int foo()
{
void *p = fftw_malloc(sizeof(fftw_complex)*64);
fftw_free(p);
printf("foo called.\n");
return 0;
}
我编译如下:
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
这一切工作。现在我用含有另一种.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.
太好了!但现在,当我尝试用ctypes的加载库:
>>> 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的。我尝试了各种各样的事情,但没有取得任何成功,而且我在这一点上相当坚持。
答
您需要将libwaveprop.so
本身链接到fftw3库。否则,Python根本不知道去哪里去得到那些缺失的符号;在任何编程语言中都没有实现读心术。
答
好的,谢谢你的帮助。
让这个工作我不得不在链接(杜)时包括依赖关系。我曾尝试过,但得到一个错误,所以解决这个问题,我不得不用'-fpic'作为CPP标志重新编译fftw。现在所有的作品。
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
感谢您的答复。 这是我尝试过的一件事。 ICPC -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop.so.1.0 libwaveprop.o -lfftw3 和 ICPC -shared -Wl,-soname,libwaveprop.so.1 -o libwaveprop .so.1.0 libwaveprop.o 都得到相同的错误: LD:/usr/local/lib/libfftw3.a(malloc.o):针对符号'fftw_kernel_malloc”重定位R_X86_64_PC32创建共享时,不能使用目的;使用-fPIC 重新编译ld:最终链接失败:错误值 我不确定该怎么做。有任何想法吗? 谢谢, -nick – 2010-04-09 10:14:41
那么,“用'-fPIC'编译为'.o'并链接到'。所以'对你依靠的图书馆“是我学到的技术。如果没有更多信息,不能诊断出什么问题,对不起。 – 2010-04-09 10:26:08