2010-06-24 54 views
2

我有一個使用openmp的c99函數,該函數按預期工作。我還寫了一個使用ctypes的python接口,導致了這個問題。 Ctypes/python找不到openmp的庫。以下是錯誤消息:使用OpenMp與ctypes進行鏈接

File "foo.py", line 2, in <module> 
    foobar=cdll.LoadLibrary("./libfoo.so") 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: ./libfoo.so: undefined symbol: GOMP_parallel_end 

而且我使用這些CMDS:

gcc -fPIC -std=c99 -lm -Wall -fopenmp -pedantic -c foo.c 
gcc -shared -o libfoo.so foo.o 
python foo.py 

我已經用Google搜索,發現了一個'解決方案'online,但我不明白是什麼意思有:

我想我應該將構造函數的restype設置爲ctypes.c_void_p。
而且我應該在argtypes中設置相應的類型,稱爲
函數爲ctypes.c_void_p。這是否會導致必要的轉換
發生?我想確認一下,這是正確的方式
來處理這種情況。

解決方案意味着什麼?或者您是否知道其他方式?

[更新]

因此,這裏是與尤利安Şerbănoiu的幫助下,正確的CMD行選項:

gcc -fPIC -std=c99 -lm -Wall -fopenmp -pedantic -c foo.c 
gcc -shared -lgomp -lrt -o libfoo.so foo.o 
python foo.py 
+1

這就是我問「你爲什麼不反對OpenMP?」這個愚蠢的問題。 – 2010-06-24 16:31:25

+0

我認爲-fopenmp對OpenMP鏈接,或者我理解錯誤嗎? – Framester 2010-06-24 16:33:04

回答

3

嘗試增加-lgomp選項,以便與OpenMP庫鏈接。來自here