我有一个用gcc编译的库,使用-fopenmp并链接到libmkl_gnu_thread.a。
当我尝试使用ctypes加载这个库时,我会收到错误消息
未定义符号:GOMP_critical_end
在没有openmp的情况下编译并链接到libmkl_sequential.a而不是gnu_thread,这个库工作得很好,但是我不想为了支持Python而构建不同的版本。
如何修复此错误?我需要用openmp支持从源代码构建python吗?我想避免这一点,因为用户不想构建自己的python来使用这个软件。
我在用蟒蛇2.7.6。
最佳答案
编译时使用-fopenmp
可以启用OpenMP支持,并在生成的对象文件中引入对GNU OpenMP运行时支持库libgomp
中函数的引用。然后,您应该将共享对象(也称为共享库)与libgomp
链接,以便告诉运行时链接器在使用库时也加载libgomp
(如果尚未通过其他依赖项加载),以便它可以解析所有符号。
可以通过两种方式连接libgomp
:
如果使用GCC还链接对象文件并生成共享对象,只需给它-fopenmp
标志。
如果您使用系统链接器(通常是ld
),请给它-lgomp
选项。
对于第二种情况有一个警告:如果您使用的g cc不是默认的系统范围的GCC,例如,您安装了多个GCC版本,或者使用来自单独包的版本,或者您自己构建了一个包,那么您应该提供与GCC版本相匹配的libgomp.so
的正确路径。