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 Files\LLVM\bin 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 Files\LLVM\bin 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 Files\LLVM\lib\clang\10.0.0\include 1> C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include 1> C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\atlmfc\include 1> C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt 1> C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\cppwinrt 1> C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Include\um 1>End of search list. 1>lld-link : error : undefined symbol: __kmpc_global_thread_num 1>>>> referenced by Z:\llvmtest\llvmtest.cpp:9 1>>>> Debug\llvmtest.obj:(main) 1> 1>lld-link : error : undefined symbol: __kmpc_push_num_threads 1>>>> referenced by Z:\llvmtest\llvmtest.cpp:15 1>>>> Debug\llvmtest.obj:(main) 1> 1>lld-link : error : undefined symbol: __kmpc_fork_call 1>>>> referenced by Z:\llvmtest\llvmtest.cpp:15 1>>>> Debug\llvmtest.obj:(main) 1> 1>lld-link : error : undefined symbol: omp_get_thread_num 1>>>> referenced by Z:\llvmtest\llvmtest.cpp:19 1>>>> Debug\llvmtest.obj:(.omp_outlined._debug__) 1> 1>lld-link : error : undefined symbol: omp_get_num_threads 1>>>> referenced by Z:\llvmtest\llvmtest.cpp:25 1>>>> Debug\llvmtest.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\n", tid); if (tid == 0) { nthreads = omp_get_num_threads(); printf("Number of threads = %d\n", nthreads); } } /* All threads join master thread and terminate */ } I have tried different options: -fopenmp, -Xclang -fopenmp compiler flags, passing -openmp and -fopenmp as linker flags, changing x64 to x86, adding C:\Program Files\LLVM\lib 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?


libdirectory there should be alibomp.libfile. You need to add it to the additional libraries in the linker settings. The problem is that VS does a separate link step and the linker doesn't know that you need the OpenMP runtime too. When you compile withclang-cl -openmp ..., the compiler driver automatically adds the OpenMP runtime library when calling the linker.-lomp.lld-linkis command-line compatible withlink, then the additional option should belibomp.lib. You may also need to add the path to LLVM'slibdirectory somewhere too.