加载库时Python ctypes错误GOMP_ritic_end

标签 python c openmp ctypes intel-mkl

我有一个使用 gcc 使用 -fopenmp 编译并链接到 libmkl_gnu_thread.a 的库。

当我尝试使用 ctypes 加载此库时,我收到错误消息 undefined symbol :GOMP_ritic_end

在没有 openmp 的情况下编译它并链接到 libmkl_sequential.a 而不是 gnu_thread,该库工作正常,但我宁愿不必构建不同的版本来支持 Python。

如何修复此错误?我需要使用 openmp 支持从源代码构建 python 吗?我想避免这种情况,因为用户不想构建自己的 python 来使用这个软件。

我使用的是python2.7.6。

最佳答案

编译时使用 -fopenmp 可以启用 OpenMP 支持,并在生成的目标文件中引入对 GNU OpenMP 运行时支持库 libgomp 中函数的引用。然后,您应该将共享对象(也称为共享库)链接到 libgomp ,以便告诉运行时链接器也加载 libgomp (如果尚未通过某些其他依赖项加载) )每当您的库被使用时,它就可以解析所有符号。

可以通过两种方式链接libgomp:

  • 如果您还使用 GCC 链接对象文件并生成共享对象,只需为其指定 -fopenmp 标志即可。
  • 如果您使用系统链接器(通常为 ld),则为其指定 -lgomp 选项。

对第二种情况的警告:如果您使用的 GCC 不是默认的系统范围的 GCC,例如如果您安装了多个 GCC 版本或使用来自单独软件包的版本或您自己构建的版本,则应提供与 GCC 版本匹配的 libgomp.so 的正确路径。

关于加载库时Python ctypes错误GOMP_ritic_end,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25795944/

相关文章:

python - Sklearn GridSearchCV,class_weight 因未知原因不工作 :(

python - 使用 matplotlib 在 Python 中绘制参数图

c - 使用指针对字符串进行排序

c++ - typedef函数指针递归

c++ - 使用 OpenMP 的并行执行比串行执行 C++ 花费的时间更长,我是否以正确的方式计算执行时间?

python - Pandas 将列转换为行

python - 使用 python glob 忽略 Windows 隐藏文件

c - 在 C 中将可变长度数组声明为全局变量

mpi - 确保混合 MPI/OpenMP 在不同的内核上运行每个 OpenMP 线程

带有 OpenMP 的 C++ 尽量避免紧密循环数组的错误共享