visual-studio - Visual Studio 2019 LLVM 中的 OpenMP 链接错误
问题描述
我一直在尝试使用集成到 Visual Studio 2019 的 LLVM 编译器构建OpenMP示例程序。
LLVM 编译器是从这里下载的(版本 10.0,win64),C:\Program Files\LLVM\bin添加到 PATH 环境变量中。LLVM 编译器工具链扩展是从Visual Studio Marketplace安装的。
它成功构建了一个 hello world 程序,但是当我尝试使用 OpenMP 时,链接器失败并出现以下错误:
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.
代码相当简单:
#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 */
}
我尝试了不同的选项:-fopenmp
编译-Xclang -fopenmp
器标志,传递-openmp
和-fopenmp
作为链接器标志,将 x64 更改为 x86,将C:\Program Files\LLVM\lib添加到 PATH。到目前为止没有任何帮助。
有趣的是,我可以通过从x64 Native Tools Command Prompt for VS 2019运行以下命令,从命令行构建相同的代码:
clang-cl -openmp llvmtest.cpp
所以,基本上,-openmp
标志就足够了......有没有人知道如何让它在 Visual Studio 中工作?
解决方案
最后,我设法让它工作了(感谢 LLVM 工具链扩展的作者 Marek Aniola,他帮助了我)。
首先,我将/openmp
标志传递给LLVM -> Additional Compiler Options(它也可以使用-openmp
)。
其次,事实证明,从 Visual Studio 构建时 OpenMP 不会自动链接(与通过 clang-cl 从命令行编译相反)。LLVM 的链接器设置与 Microsoft 链接器的指定方式相同。
必须将库C:\Program Files\LLVM\lib的路径添加到Linker -> General -> Additional Library Directories。
还需要在Linker -> Input -> Additional Dependencies中列出libomp.lib。
Linker -> Optimization -> Link Time Code Generation必须设置为Default。
这些步骤让我成功地构建了代码(64 位应用程序)。虽然 64 位 LLVM 编译器可以构建 32 位程序,但它仅包含 x64 版本的 OpenMP 库,因此为了构建 32 位应用程序,我必须链接libomp.lib并从另一个 LLVM 发行版复制libomp.dll . 如果有更好的方法可以做到这一点,请告诉我。
推荐阅读
- android - 如何修复 AAPT:在包“android”中找不到属性“appComponentFactory”的资源标识符?
- react-final-form - 如何让提交错误正确显示?
- charts - 如何在 Pinescript 中自定义图表?
- python-3.x - 如何删除列表列表中的数字?
- javascript - 为什么调试器中包含两次 React 源代码?
- php - Laravel 运行迁移,但不更新迁移表
- python - R foreach 使用 rpy2 python 永远运行 jupyter notebook
- list - 在 kotlin 中输入一个列表作为函数的默认值
- nginx - 如何在自定义域上使用 gunicorn 通过 nginx 提供烧瓶应用程序?
- apache-flink - 如何在 Flink 中创建动态指标