首页 > 解决方案 > 使用 OpenMP 的 Clang 编译的 Python 扩展中的未定义符号

问题描述

在使用 Clang 编译具有 OpenMP 的 Python 扩展时,我遇到了一个奇怪的问题。

最小的例子

我设法将我的实际问题归结为以下代码: Python 扩展非常简单,同时仍然具有 OpenMP。除了 function bar,这主要是标准样板:

# include <Python.h>

static PyObject * bar(PyObject *self)
{
    #pragma omp parallel sections
    {
        #pragma omp section
        {float x=42.0; x+=1;}
    }
    Py_RETURN_NONE;
}

static PyMethodDef foo_methods[] = {
    {"bar", (PyCFunction) bar, METH_NOARGS, NULL},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef moduledef = {
    PyModuleDef_HEAD_INIT, "foo", NULL, -1,
    foo_methods, NULL, NULL, NULL, NULL
};

PyMODINIT_FUNC PyInit_foo(void)
{
    return PyModule_Create(&moduledef);
}

有了上面的内容foo.c,我编译并加载它:

clang -fPIC -fopenmp -I/usr/include/python3.7m -c foo.c -o foo.o
clang -shared foo.o -o foo.so -lgomp
python3 -c "import foo"

最后一行,即模块的导入,抛出如下错误:

导入错误:/home/wrzlprmft/.../foo.so:未定义符号:__kmpc_for_static_fini

到目前为止我发现了什么

问题

这里出了什么问题,我该如何解决?现在我什至不知道这是否是我在 Clang、OpenMP 或 Python 中的错误。

标签: clangopenmppython-c-apiundefined-symbol

解决方案


推荐阅读