使用ctypes和OpenMp链接

2 投票
2 回答
1390 浏览
提问于 2025-04-16 00:23

我有一个使用了openmp的c99函数,运行得很好。我还写了一个用ctypes的python接口,但这导致了一些问题。ctypes/python找不到openmp的库。这里是错误信息:

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

我使用了这些命令:

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

我已经在网上搜索过,找到一个“解决方案” 在线,但是我不太明白里面的意思:

我想我应该在构造函数上设置restype为ctypes.c_void_p。
而且我应该在被调用的函数的argtypes中设置相应的类型为ctypes.c_void_p。这样会导致必要的转换发生吗?我想确认一下这是否是处理这种情况的正确方法。

这个解决方案是什么意思,或者你知道其他方法吗?

[更新]

这是在Iulian Şerbănoiu的帮助下得到的正确命令行选项:

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

2 个回答

1

在链接的时候,你还需要加上 -fopenmp 这个标志:

gcc -shared -fopenmp -o libfoo.so foo.o
3

试着加上 -lgomp 这个选项,这样可以链接到 openmp 库。具体可以参考 这里

撰写回答