4

ctypes を介して Python から呼び出したい関数を含むライブラリを C で書いています。

私はこれを別のライブラリで成功させましたが、そのライブラリには非常にバニラの依存関係 (つまり、、、、、)しかありfstreamませんでした。私が取り組んでいる他のライブラリには、より複雑な依存関係があります。mathmallocstdiostdlib

たとえば、 を使用してみます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で解決する方法がわかりません。私は成功せずにさまざまなことを試しましたが、この時点でかなり行き詰まっています。

4

2 に答える 2

4

わかりました、助けてくれてありがとう。

これを機能させるには、リンク時に依存関係を含める必要がありました (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

ありがとう -ニック

于 2010-04-09T11:54:00.190 に答える
0

libwaveprop.sofftw3 ライブラリに対してそれ自体をリンクする必要があります。そうしないと、Python は、不足しているシンボルを取得するためにどこに行けばよいかわかりません。読心術はどのプログラミング言語にも実装されていません。

于 2010-04-09T10:02:36.697 に答える