2010-04-09 48 views
4

我正在寫一些庫,其中包含我想通過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的。我嘗試了各種各樣的事情,但沒有取得任何成功,而且我在這一點上相當堅持。

回答

0

您需要將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

4

好的,謝謝你的幫助。

讓這個工作我不得不在鏈接(杜)時包括依賴關係。我曾嘗試過,但得到一個錯誤,所以解決這個問題,我不得不用'-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