加载库时Python ctypes错误GOMP_critical_end

2 投票
1 回答
1316 浏览
提问于 2025-04-21 04:41

我有一个库,是用gcc编译的,使用了-fopenmp选项,并且链接了libmkl_gnu_thread.a这个文件。

当我尝试用ctypes加载这个库时,出现了一个错误信息:未定义的符号:GOMP_critical_end。

如果我不使用openmp,并且链接libmkl_sequential.a而不是gnu_thread,这个库就能正常工作,但我不想为了支持Python而去构建不同的版本。

我该如何解决这个错误?我需要从源代码重新编译Python并支持openmp吗?我希望能避免这样,因为用户不想为了使用这个软件而自己去编译Python。

我使用的是python2.7.6。

1 个回答

4

在编译时加上 -fopenmp 这个选项,可以让你的程序支持 OpenMP。这样做会在生成的目标文件中引入一些来自 GNU OpenMP 运行时支持库 libgomp 的函数引用。为了确保在使用你的共享库时,运行时链接器能够加载 libgomp(如果它还没有通过其他依赖加载的话),你需要把你的共享对象(也叫共享库)链接到 libgomp

链接到 libgomp 有两种方法:

  • 如果你使用 GCC 来链接目标文件并生成共享对象,只需加上 -fopenmp 这个选项。
  • 如果你使用系统链接器(通常是 ld),那么就需要加上 -lgomp 这个选项。

这里有个小提醒:如果你使用的 GCC 不是系统默认的版本,比如你安装了多个 GCC 版本,或者使用的是来自其他包的版本,或者是自己编译的版本,你需要提供正确的 libgomp.so 的路径,以确保它和你使用的 GCC 版本匹配。

撰写回答