我需要找到一条编译器/链接器指令,可以在使用-fopenmp选项时不自动链接libgomp。原因是我正在尝试构建使用Intel的MKL BLAS的程序,而MKL需要添加一个单独的Intel库来处理多线程(例如libmkl_intel_thread或libmkl_gnu_thread)。然而,链接MKL与libgomp的库在包括我的操作系统在内的某些操作系统上不可用。这迫使我链接libmkl_intel_thread,而这又必须链接libiomp5。虽然我能够构建我的程序包,但有些二进制文件链接了libgomp和libiomp5。我不能确保这是否会引起问题,但已经发生了一些崩溃,链接组合很可疑,即使它没有引起崩溃,也肯定是一个可怕的低效率问题。我正在尝试使用gcc 4.9.1进行此操作。
避免使用-fopenmp不是一个选项,因为这是为编译由几个子包组成的相当大的软件包而设计的,这些子包的Makefile不是很完美,并且稍后可能会编译其他来源(插件)的附加软件包。强制使用通用编译器/链接器指令并不困难。然而,打开--enable-openmp选项会同时激活-fopenmp和用于触发与多线程相关的代码的定义。试图将这三个选项(--enable-openmp、-fopenmp和与--enable-openmp链接的代码)分开是不可行的。
我查看了手册页面,没有找到任何gcc指令可以允许选择一个openmp库。Intel的论坛有一个非常古老的讨论,他们建议在-fopenmp之后指定一个静态库,然后加上--as-needed。这似乎相当脆弱,并且很可能会干扰插件包。llvm-openmp似乎曾经考虑过一个-fopenmp=libiomp5的指令,但它似乎已经在3.5版本中被删除了,而且我还想使用gcc。
谢谢。
ligiomp5.a
导出的符号,确实似乎有一个 GNU 兼容层暴露出来。我会相应地更新我的答案。 - Hristo Iliev