Python ctypes和动态链接

时间:2010-04-09 09:56:15

标签: python ctypes dynamic-linking

我在C中编写了一些库,其中包含我想通过ctypes从Python调用的函数。

我已经成功地完成了另一个库,但该库只有非常独立的依赖(即fstreammathmallocstdio,{{1} })。我正在处理的另一个库有更复杂的依赖项。

例如,我会尝试使用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'

大!但现在当我尝试使用ctypes加载库时:

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

所以这是同样的问题,但我不知道如何为ctypes解决它。我已经尝试过各种各样的事情而没有任何成功,而且我现在非常坚持。

2 个答案:

答案 0 :(得分:4)

好的,谢谢你的帮助。

要使其工作,我必须在链接(duh)时包含依赖项。我之前尝试过这个但是得到了一个错误,所以解决这个问题我必须用'-fpic'重新编译fftw作为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

答案 1 :(得分:0)

您需要将libwaveprop.so本身与fftw3库相关联。否则Python根本不知道去哪里获取那些丢失的符号;精神阅读没有用任何编程语言实现。