Неопределенный символ в Clang-скомпилированном расширении Python с использованием OpenMP - PullRequest
2 голосов
/ 06 марта 2020

Я сталкиваюсь со странной проблемой при компиляции расширения Python с OpenMP с помощью Clang.

Минимальный пример

Мне удалось свести мою настоящую проблему к следующему коду: The * Расширение 1047 * не может быть намного проще, хотя и с поддержкой OpenMP. Помимо функции 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"

Последняя строка при импорте модуля выдается следующая ошибка:

ImportError: /home/wrzlprmft/…/foo.so: неопределенный символ: __kmpc_for_static_fini

Что я до сих пор не выяснено

  • Этого не происходит при замене Clang на G CC.
  • Этого не происходит с обычными общими библиотеками (без Python).
  • Использование Setuptools для компиляции расширения не помогает. (Фактически, мои команды компиляции - это сокращение от того, что Setuptools делает, чтобы выяснить, использует ли он какие-либо несущественные расширения компилятора, которые вызывают это.)
  • Все это происходит в Ubuntu 19.10 с Python 3.7, Clang 9.0.0-2 и G CC 9.2.1.
  • Я также могу повторить проблему на текущем Arch Linux с Python 3.8 и Clang 9.0.1.
  • Это работало до года go, возможно, дольше.
  • Использование Python 3.6 не помогает.
  • Использование Clang 3.8, 4.0, 6.0, 7 или 8 не помогает .
  • Здесь , кто-то сообщает об аналогичной проблеме при попытке скомпилировать TensorFlow. Это еще не решено.

Вопрос

Что здесь не так и как я могу это исправить? Прямо сейчас у меня даже нет идеи, является ли это ошибкой мной, в Clang, OpenMP или Python.

...