Python的ctypes和动态链接

问题描述:

我正在写一些库,其中包含我想通过ctypes从Python调用的函数。Python的ctypes和动态链接

我做这个成功的另一个库,但该库只有非常香草依赖(即fstreammathmallocstdiostdlib)。我正在处理的其他库具有更复杂的依赖关系。例如,我会尝试使用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根本不知道去哪里去得到那些缺失的符号;在任何编程语言中都没有实现读心术。

+0

感谢您的答复。 这是我尝试过的一件事。 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

+0

那么,“用'-fPIC'编译为'.o'并链接到'。所以'对你依靠的图书馆“是我学到的技术。如果没有更多信息,不能诊断出什么问题,对不起。 – 2010-04-09 10:26:08

好的,谢谢你的帮助。

让这个工作我不得不在链接(杜)时包括依赖关系。我曾尝试过,但得到一个错误,所以解决这个问题,我不得不用'-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