【问题标题】:Python ctypes error GOMP_critical_end when loading library加载库时Python ctypes错误GOMP_critical_end
【发布时间】:2014-09-11 19:59:31
【问题描述】:

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

当我尝试使用 ctypes 加载此库时,我收到错误消息 未定义符号:GOMP_critical_end

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

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

我正在使用 python2.7.6。

【问题讨论】:

  • 当你构建你的库时,你是否链接到 -lgomp?
  • 据我所知,没有。我应该吗?
  • 是的,应该可以解决问题
  • 如果您使用 GCC 链接库,请添加 -fopenmp。如果您改用ld,请添加-lgomp
  • 如果您将其作为答案,我会接受 Hristo Iliev 的答案。

标签: python c openmp ctypes intel-mkl


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-08-25
    • 2011-07-13
    相关资源
    最近更新 更多