I've been trying to build an OpenMP sample program with an LLVM compiler integrated to Visual Studio 2019.
LLVM compiler was downloaded from here (version 10.0, win64), C:Program FilesLLVMin added to the PATH environment variable. LLVM Compiler Toolchain extension was installed from Visual Studio Marketplace.
It successfully builds a hello world program, but when I try to use OpenMP the linker fails with the following errors:
1>clang version 10.0.0
1>Target: x86_64-pc-windows-msvc
1>Thread model: posix
1>InstalledDir: C:Program FilesLLVMin
1> (in-process)
1> "C:\Program Files\LLVM\bin\clang-cl.exe" -cc1 -triple x86_64-pc-windows-msvc19.26.28805 -emit-obj -mrelax-all -mincremental-linker-compatible -disable-free -disable-llvm-verifier -discard-value-names -main-file-name llvmtest.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=none -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -mllvm -x86-asm-syntax=intel -D_DEBUG -D_MT -D_DLL --dependent-lib=msvcrtd --dependent-lib=oldnames -stack-protector 2 -fcxx-exceptions -fexceptions -fexternc-nounwind -fms-volatile -fdefault-calling-conv=cdecl -fdiagnostics-format msvc -gcodeview -debug-info-kind=limited -v -resource-dir "C:\Program Files\LLVM\lib\clang\10.0.0" -D _DEBUG -D _CONSOLE -D _UNICODE -D UNICODE -internal-isystem "C:\Program Files\LLVM\lib\clang\10.0.0\include" -internal-isystem "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include" -internal-isystem "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\atlmfc\include" -internal-isystem "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include" -internal-isystem "C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt" -internal-isystem "C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um" -internal-isystem "C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared" -internal-isystem "C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt" -internal-isystem "C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\cppwinrt" -internal-isystem "C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Include\um" -O0 -Wall -Wno-error -fdeprecated-macro -fdebug-compilation-dir "Z:\llvmtest" -ferror-limit 19 -fmessage-length 0 -fopenmp -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.26.28805 -std=c++14 -fdelayed-template-parsing -fobjc-runtime=gcc -fno-caret-diagnostics -fdiagnostics-show-option -faddrsig -o "Debug\llvmtest.obj" -x c++ llvmtest.cpp
1>clang -cc1 version 10.0.0 based upon LLVM 10.0.0 default target x86_64-pc-windows-msvc
1>#include "..." search starts here:
1>#include <...> search starts here:
1> C:Program FilesLLVMlibclang10.0.0include
1> C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.26.28801include
1> C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.26.28801atlmfcinclude
1> C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryVSinclude
1> C:Program Files (x86)Windows Kits10Include10.0.18362.0ucrt
1> C:Program Files (x86)Windows Kits10Include10.0.18362.0um
1> C:Program Files (x86)Windows Kits10Include10.0.18362.0shared
1> C:Program Files (x86)Windows Kits10Include10.0.18362.0winrt
1> C:Program Files (x86)Windows Kits10Include10.0.18362.0cppwinrt
1> C:Program Files (x86)Windows KitsNETFXSDK4.6.1Includeum
1>End of search list.
1>lld-link : error : undefined symbol: __kmpc_global_thread_num
1>>>> referenced by Z:llvmtestllvmtest.cpp:9
1>>>> Debugllvmtest.obj:(main)
1>
1>lld-link : error : undefined symbol: __kmpc_push_num_threads
1>>>> referenced by Z:llvmtestllvmtest.cpp:15
1>>>> Debugllvmtest.obj:(main)
1>
1>lld-link : error : undefined symbol: __kmpc_fork_call
1>>>> referenced by Z:llvmtestllvmtest.cpp:15
1>>>> Debugllvmtest.obj:(main)
1>
1>lld-link : error : undefined symbol: omp_get_thread_num
1>>>> referenced by Z:llvmtestllvmtest.cpp:19
1>>>> Debugllvmtest.obj:(.omp_outlined._debug__)
1>
1>lld-link : error : undefined symbol: omp_get_num_threads
1>>>> referenced by Z:llvmtestllvmtest.cpp:25
1>>>> Debugllvmtest.obj:(.omp_outlined._debug__)
1>Done building project "llvmtest.vcxproj" -- FAILED.
The code is rather trivial:
#include <omp.h>
#include <stdio.h>
int main()
{
int nthreads, tid;
//omp_set_num_threads(4);
#pragma omp parallel private(tid) num_threads(3)
{
tid = omp_get_thread_num();
printf("Hello World from thread = %d
", tid);
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d
", nthreads);
}
} /* All threads join master thread and terminate */
}
Project settings shown below:
I have tried different options: -fopenmp
, -Xclang -fopenmp
compiler flags, passing -openmp
and -fopenmp
as linker flags, changing x64 to x86, adding C:Program FilesLLVMlib to the PATH. Nothing helped so far.
Interestingly enough, I can build the same code from the command line by running the following from x64 Native Tools Command Prompt for VS 2019:
clang-cl -openmp llvmtest.cpp
So, basically, -openmp
flag was enough... Does anyone have an idea how to make it work in Visual Studio?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…