我需要找出一个可以输入 gcc 的编译器/链接器指令,以便在指定 -fopenmp 时它不会自动链接 libgomp。
原因是我正在尝试针对英特尔的 MKL BLAS 进行构建。MKL 需要添加一个单独的英特尔库来处理多线程(例如,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 的代码)分开是不可行的。
我浏览了手册页,但没有看到任何允许选择 openmp 库的 gcc 指令。英特尔的论坛有一个非常古老的讨论,他们建议在 -fopenmp 之后立即指定一个静态库,然后是 --as-needed。这看起来相当摇摇晃晃,并且也有很大的潜力干扰插件包。llvm-openmp 似乎曾经考虑过 -fopenmp=libiomp5 指令,但它似乎已在 3.5 版本中被删除,而且我无论如何都在尝试使用 gcc。
谢谢。