我在Windows下使用嘎吱声 (LLVM) 8的Windows版本。
我正在编译一个使用OpenMP的代码。
在Clang的lib文件夹下有两个与OpenMP相关的文件:
libomp.lib。libiomp5md.dll。我的问题是:
-Xclang -fopenmp。在GCC和ICC中,使用标志告诉编译器自动链接OpenMP库。那Clang呢?它是自动的还是必须手动链接到libomp.lib?有办法触发到OpenMP库的自动链接吗?
答案:这是在迈克尔·克伦姆的回答如下中回答的--使用clang驱动程序编译和链接,然后-fopenmp将与GCC一样工作。libomp.lib (定义为链接器的库)时,输出exe需要libomp.dll,而提供的OpenMP动态库是libiomp5md.dll。那是错误还是因为我手动链接?
应答:libomp.dll是在bin文件夹中提供的,而不是lib文件夹中提供的。clang-cl驱动程序不使用/openmp或-openmp作为MSVC的cl编译器。
答案:目前可以使用clang -fopenmp ...、clang-cl -Xclang -fopenmp ...或clang-cl /clang:-fopenmp ... (相当于-Xclang -fopenmp)来完成。备注
在Windows上,我使用clang-cl使用Clang的Windows驱动程序。
发布于 2019-05-04 10:04:05
要在Windows上编译和链接OpenMP代码,您必须将-fopenmp传递给编译器和链接器:
clang -fopenmp -o bla.obj -c bla.c
clang -fopenmp -o bla.exe bla.obj发布于 2022-02-25 04:03:26
clang-cl 使OpenMP库的实际内容更加清晰,以及如何在上使用这些库
libomp.dll和libiomp5md.dll是相同的文件!
在为Windows编译时,您可以针对libomp.lib或libiomp5md.lib进行链接,后者将在运行时链接到同名DLL,即libomp.dll或libiomp5md.dll。
如果加载两个使用“异名DLL”的文件,解释器将崩溃,并给出一个严重错误,例如:OMP: error #15:初始化libiomp5md.dll,但发现libomp.dll已初始化.。
为什么?因为程序不知道它们是同一个DLL,所以它们有不同的名称,所以假设它们是不同的。然后它就坠毁了。仅出于这个原因,您可以选择在程序中交换链接到的OpenMP DLL。
如果您的程序没有崩溃并给您一个错误,您可以继续使用相同的链接到OpenMP。否则,若要关闭错误,请链接到已由另一个程序加载的错误。
如果使用clang-cl.exe (它是MSVC cl.exe的“插入"Clang替换),则应该传递一个编译器参数(如-Xclang -fopenmp ),该参数将把参数转换为”Clang语言“。不要忘记仍然传递给链接器您选择的OpenMP LIB,因为在Windows上,它不会是自动的。
这就是我所了解到的关于OpenMP在Windows上链接的尽可能简单的内容。
https://stackoverflow.com/questions/55976484
复制相似问题