Python C类型和动态链接

Python C类型和动态链接,python,ctypes,dynamic-linking,Python,Ctypes,Dynamic Linking,我正在用C编写一些库,其中包含我希望通过ctypes从Python调用的函数 我在另一个库中成功地实现了这一点,但该库只有非常普通的依赖项(即fstream,math,malloc,stdio,stdlib)。我正在处理的另一个库具有更复杂的依赖项 例如,我将尝试使用fftw3。作为测试,我将尝试编译一个简单的.cpp文件,其中包含: int foo() { void *p = fftw_malloc( sizeof(fftw_complex)*64 ); fftw_free(

我正在用C编写一些库,其中包含我希望通过ctypes从Python调用的函数

我在另一个库中成功地实现了这一点,但该库只有非常普通的依赖项(即
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;
}        
int main()
{
    foo();
}
我将其汇编为:

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 foo()
{
    void *p  = fftw_malloc( sizeof(fftw_complex)*64 );
    fftw_free(p);

    printf("foo called.\n");

    return 0;
}        
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导入*
>>>打印cdll.LoadLibrary('/usr/local/lib/libwaveprop.so.1')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
LoadLibrary中的文件“/usr/lib64/python2.6/ctypes/_init__uuu.py”,第431行
返回自我类型(名称)
文件“/usr/lib64/python2.6/ctypes/_init__.py”,第353行,在_init中__
self.\u handle=\u dlopen(self.\u名称,模式)
OSError:/usr/local/lib/libwaveprop.so.1:未定义符号:fftw\u free

所以这是相同的问题,但我不知道如何解决CType的问题。我尝试了各种各样的方法,但都没有成功,在这一点上我非常困惑。

您需要链接
libwaveprop。因此
自身与fftw3库相对应。否则Python根本不知道去哪里获取丢失的符号;任何编程语言都不能实现读心术。

好的,谢谢您的帮助

为了让这个工作,我必须在链接时包含依赖项(duh)。我以前尝试过这个方法,但出现了一个错误,所以要解决这个问题,我必须用'-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
谢谢,
-尼克

谢谢你的回复。这是我尝试过的事情之一。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\u kernel\u malloc”的重新定位R\u X86\u 64\u PC32;用-fPIC ld重新编译:最终链接失败:错误值我不确定该怎么办。有什么想法吗?谢谢,-nickWell,“使用
-fPIC
编译到
.o
,并链接到
。因此,
针对您所依赖的库”是我学到的技巧。抱歉,没有进一步的信息,无法诊断出问题所在。