Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
417 views
in Technique[技术] by (71.8m points)

clang - OpenMP linking errors in Visual Studio 2019 LLVM

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: enter image description here enter image description here

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Finally, I have managed to make it work (thanks to Marek Aniola, the author of the LLVM Toolchain extension, who helped me out).

First, I passed the /openmp flag to LLVM -> Additional Compiler Options (it works with -openmp too).

Second, it turns out that OpenMP is not automatically linked when building from Visual Studio (in contrast to compiling from the command line by means of clang-cl). Linker settings for LLVM are specified the same way as for the Microsoft linker.

The path to libraries C:Program FilesLLVMlib has to be added to Linker -> General -> Additional Library Directories.

It is also necessary to list libomp.lib in Linker -> Input -> Additional Dependencies.

Linker -> Optimization -> Link Time Code Generation must be set to Default.

These steps let me successfully build the code (64-bit application). Although the 64-bit LLVM compiler can build a 32-bit program, it includes only x64 version of OpenMP libraries, so in order to build a 32-bit application I had to link libomp.lib and copy libomp.dll from another LLVM distribution. If there is a better way to do that, please let me know.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...