我有一个使用 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/