加载库时Python ctypes错误GOMP_critical_end
我有一个库,是用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 版本匹配。