Windows 中 OpenMP 代码的 LLVM / Clang 8 编译

LLVM / Clang 8 Compilation of OpenMP Code in Windows

我在 Windows.
下使用 Clang (LLVM) 8 的 Windows 版本 我正在编译使用 OpenMP.

的代码

在 Clang 的 lib 文件夹下有 2 个与 OpenMP 相关的文件:

  1. libomp.lib.
  2. libiomp5md.dll.

我的问题是:

  1. 当我编译代码时,我为编译器使用标志 -Xclang -fopenmp。在 GCC 和 ICC 中,使用标志告诉编译器自动 link OpenMP 库。铿锵声呢?它是自动执行还是必须我手动 link 和 libomp.lib?有没有办法触发自动 linking 到 OpenMP 库?
    回答:在Michael Klemm's 中回答了这个问题——使用clang驱动程序进行编译和linking,然后-fopenmp就可以工作了如 GCC.
  2. 当我手动 link 和 libomp.lib 时(定义为 linker 的库)输出 exe 需要 libomp.dll 而提供的 OpenMP动态库是libiomp5md.dll。这是一个错误还是因为我手动 link?
    答案libomp.dll 是在 bin 文件夹而不是 lib 文件夹中提供的。
  3. 在 Windows 下,在 Clang 中使用 OpenMP 的正确方法是什么? clang-cl 驱动程序不适用于 /openmp-openmp 作为 MSVC 的 cl 编译器。
    回答:目前可以用clang -fopenmp ...clang-cl -Xclang -fopenmp ...clang-cl /clang:-fopenmp ...(相当于-Xclang -fopenmp)来完成。

备注
在 Windows 我使用 Windows 使用 clang-cl.

的 Clang 驱动程序

要在 Windows 上使用 clang 编译和 link OpenMP 代码,您必须将 -fopenmp 传递给编译器和 linker:

clang -fopenmp -o bla.obj -c bla.c
clang -fopenmp -o bla.exe bla.obj

进一步阐明 OpenMP 库的实际含义,以及如何在 Windows 和 clang-cl[=38 上使用它们=]

libomp.dll 和 libiomp5md.dll 是相同的文件!

为 Windows 编译时,您 link 反对 libomp.liblibiomp5md.lib,这将在运行时 link 到 same-named DLL,即分别为 libomp.dlllibiomp5md.dll

如果您加载 2 个使用“different-name DLL”的文件,解释器将崩溃并给您一个令人讨厌的错误,例如:OMP:错误 #15:正在初始化 libiomp5md.dll,却发现libomp.dll已经初始化。

为什么?因为程序不知道它们是同一个 DLL,它们有不同的名称,所以它假定它们是不同的。它崩溃了。仅出于这个原因,您可以选择在程序中将 link 交换到哪个 OpenMP DLL。

如果您的程序没有崩溃并给您一个错误,您可以继续使用与 OpenMP 相同的 link。否则,要消除错误,link 到已经由另一个程序加载的错误。

如果使用 clang-cl.exe,它是 MSVC cl.exe 的“drop-in”Clang 替代品,您应该传递一个编译器参数,例如 -Xclang -fopenmp,它将转换参数到“铿锵语言”。不要忘记仍然将您选择的 OpenMP LIB 传递给 linker,因为在 Windows 上它不会是自动的。

这就是我在 Windows.

上学到的关于 OpenMP 的所有知识,尽可能简短 link