使用 clang-cl 在 Visual Studio 2019 中使用 Openmp 4/5

Posted

技术标签:

【中文标题】使用 clang-cl 在 Visual Studio 2019 中使用 Openmp 4/5【英文标题】:Using Openmp 4/5 in Visual Studio 2019 using clang-cl 【发布时间】:2020-02-17 15:42:23 【问题描述】:

我正在尝试使用 OpenMP 运行一个简单的项目。由于 Visual Studio 仅支持 OpenMP 2,所以我尝试使用 Visual Studio 2019 附带的 LLVM clang-cl 编译和运行项目。编译部分似乎还可以,但在链接阶段,链接器无法解析 OMP 函数。

这是我的代码,只有 1 个文件:

#include <stdio.h>

void fn() 
    #pragma omp parallel num_threads(5)
    
        int i;
        #pragma omp task depend(in : i)
        for (i = 0; i < 1; i++) 
            printf("task\n");
        
    


int main() 
    printf("hello\n");
    fn();

我的 Visual Studio 项目属性:

Windows SDK version: 10.0(最新安装版本) (10.0.18362.0) Platform toolset: LLVM (clang-cl) C/c++ - Command Line - Additional Options: /Zc:twoPhase- -Xclang -fopenmp -v Linker - Additional Dependencies: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\lib\libomp.libC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\lib\libiomp5md.lib Linker - Additional Library Directories: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\lib Linker - Command Lines - Additional Options: -fopenmp -verbose

运行项目时的错误日志

1>lld-link : error : undefined symbol: __kmpc_global_thread_num
1>>>> referenced by D:\Repositories\Test-clang\Test-clang\Source.cpp:4
1>>>>               x64\Debug\Source.obj:(void __cdecl fn(void))
1>
1>lld-link : error : undefined symbol: __kmpc_push_num_threads
1>>>> referenced by D:\Repositories\Test-clang\Test-clang\Source.cpp:7
1>>>>               x64\Debug\Source.obj:(void __cdecl fn(void))
1>
1>lld-link : error : undefined symbol: __kmpc_fork_call
1>>>> referenced by D:\Repositories\Test-clang\Test-clang\Source.cpp:7
1>>>>               x64\Debug\Source.obj:(void __cdecl fn(void))
1>
1>lld-link : error : undefined symbol: __kmpc_omp_task_alloc
1>>>> referenced by D:\Repositories\Test-clang\Test-clang\Source.cpp:10
1>>>>               x64\Debug\Source.obj:(.omp_outlined._debug__)
1>
1>lld-link : error : undefined symbol: __kmpc_omp_task_with_deps
1>>>> referenced by D:\Repositories\Test-clang\Test-clang\Source.cpp:10
1>>>>               x64\Debug\Source.obj:(.omp_outlined._debug__)
1>Done building project "Test-clang.vcxproj" -- FAILED.

我正在使用 Visual Studio Community 2019。那么如何配置项目以使 OpenMP 工作?


我也尝试过像answer 那样编译,它可以工作。

clang -fopenmp -o Source.obj -c Source.cpp
clang -fopenmp -o Source.exe Source.obj

它也适用于 clang-cl

clang-cl -Xclang -fopenmp -o Source.obj -c Source.cpp
clang-cl /clang:-fopenmp -o Source.exe Source.obj -v

但是我不知道如何让Visual Studio使用上述方式构建项目。

【问题讨论】:

libiomp5md.lib 在这里绝对没用,因为它是二进制等价于libomp.lib。以及用于链接器的 -fopenmp 我已经检查过了,程序现在可以在 VS 16.6.2 中完美地编译和运行。 啊,忘了你应该像&lt;!-- &lt;VCMessage Code="MSB8055" Type="Error" Condition="('%(ClCompile.OpenMPSupport)' == 'true')" /&gt; --&gt;这样关闭Microsoft.Cpp.ClangCl.Common.targets中的多线程错误。 我在***.com/a/68378031/7268445 发布的答案可能会对您/未来的读者有所帮助。 【参考方案1】:

您是否已将该库添加到您的项目依赖项中?

【讨论】:

是的,我已经添加了包含libomp.liblibiomp5md.lib的文件夹:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\lib 我没有在你的程序中看到 include headers 的 OpenMP ?!你打算如何使用这个库而不包括它的头文件? 即使使用 标头,它仍然无法正常工作。此外,即使没有 标头,我也可以使用 clang 在 GitBash 中编译和运行 您不需要为您的程序包含 OpenMP 标头以要求链接到 OpenMP 运行时。所有这些 #pragma omp 都转换为对 libomp 内部函数的调用。【参考方案2】:

您可能链接到了不正确的 openmp 库。我想问题是您正在构建 x64 版本,但与 x86 库链接。注意有两个目录: ...\VC\Tools\Llvm\lib ...\VC\Tools\Llvm\x64\lib

【讨论】:

以上是关于使用 clang-cl 在 Visual Studio 2019 中使用 Openmp 4/5的主要内容,如果未能解决你的问题,请参考以下文章

使用 clang-cl 用 openmp 编译 C 代码

cmake 将 clang-cl 检测为 clang

使用带有 NMake 样式 Makefile 的 clang-cl 无法回显

VS2019下载

用visual studio 2017来调试python

VS2019 中的 Clang 选项