clang - 使用 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
到目前为止我发现了什么
- 用 GCC 替换 Clang 时不会发生这种情况。
- 常规共享库(不涉及 Python)不会发生这种情况。
- 使用 Setuptools 编译扩展没有帮助。(事实上,我的编译命令减少了 Setuptools 所做的工作,以查明它是否使用了导致这种情况的任何非必要的编译器扩展。)
- 所有这些都发生在带有 Python 3.7、Clang 9.0.0-2 和 GCC 9.2.1 的 Ubuntu 19.10 上。
- 我还可以使用 Python 3.8 和 Clang 9.0.1 在当前的 Arch Linux 上复制该问题。
- 这一直有效到一年前,可能更长。
- 使用 Python 3.6 没有帮助。
- 使用 Clang 3.8、4.0、6.0、7 或 8 没有帮助。
- 在这里,有人在尝试编译 TensorFlow 时报告了类似的问题。这还没有解决。
问题
这里出了什么问题,我该如何解决?现在我什至不知道这是否是我在 Clang、OpenMP 或 Python 中的错误。
解决方案
推荐阅读
- node.js - 如何在节点 v9.11 中使用 Promise?
- c# - 如何获得文本框的编辑前和编辑后?
- mysql - 我必须通过从 SQL 表中检索来过滤记录。我希望 sql 中我的表列中同一字段中的值不再显示
- python - 如何使用 selenium 从空选项卡中获取 URL“about:blank”?
- javascript - JavaScript Native Map 类被其他库覆盖
- asp.net - ASP.NET Core Web Api 发布请求 404 Not Found
- python - Python 随机乘以导入的嵌套列表的值
- html - Webpack 4 html 部分解析文件中的图像
- android - 从片段调用片段并返回第一个返回
- html - 如何使用 ViewContainerRef 调用 Angular 组件