使用 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.lib
和 C:\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 中完美地编译和运行。
啊,忘了你应该像<!-- <VCMessage Code="MSB8055" Type="Error" Condition="('%(ClCompile.OpenMPSupport)' == 'true')" /> -->
这样关闭Microsoft.Cpp.ClangCl.Common.targets
中的多线程错误。
我在***.com/a/68378031/7268445 发布的答案可能会对您/未来的读者有所帮助。
【参考方案1】:
您是否已将该库添加到您的项目依赖项中?
【讨论】:
是的,我已经添加了包含libomp.lib
和libiomp5md.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的主要内容,如果未能解决你的问题,请参考以下文章