我有一个使用OpenMP进行并行化的小测试项目。我的目标是编译它,以便生成
C++编译器
"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe"
无法编译简单测试程序。
以下是失败的输出:
Change Dir: C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeTmp Run Build Command(s):C:/PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Building CXX object CMakeFiles\cmTC_bd131.dir\testCXXCompiler.cxx.obj [2/2] Linking CXX executable cmTC_bd131.exe FAILED: cmTC_bd131.exe cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_bd131.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~1\MINGW-~1\X86_64~1.0-P\mingw64\bin\ld.exe /nologo CMakeFiles\cmTC_bd131.dir\testCXXCompiler.cxx.obj /out:cmTC_bd131.exe /implib:cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." RC Pass 1: command "rc /fo CMakeFiles\cmTC_bd131.dir/manifest.res CMakeFiles\cmTC_bd131.dir/manifest.rc" failed (exit code 0) with the following output: The system cannot find the file specified ninja: build stopped: subcommand failed.
CMake将无法正确生成此项目。 调用栈(最近的调用在最前): CMakeLists.txt:2 (project)
-- 配置不完整,出现错误! 请参阅 "C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log"。 请参阅 "C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log"。
除了MSVC,还可以使用Clang和Ninja:
.dll
和.lib
库(因为我的真实项目链接到使用这些类型分发的外部库),并支持OpenMP 4.5或更新版本,并且可以从命令行执行,以便在docker上进行测试和检查(docker部分不在本问题的范围内,只是为了说明我为什么需要它能够从命令行工作)。我可以用不同的编译器编译这个项目,但都不满意:
- MSVC:
mkdir build-msvc
,然后cmake ..
(从新创建的文件夹中)最后cmake --build . --config Release
。这个编译很好,但只支持OpenMP 2.0,因此对于我的真实项目来说不是一个好选择。 - Intel Parallel Studio:
mkdir build-intel
,然后cmake .. -T "Intel C++ Compiler 19.0"
(从新创建的文件夹中)最后cmake --build . --config Release
。它支持OpenMP 5.0,但其许可证对我来说相当昂贵。 - MinGW x64 g++:
mkdir build-g++
,然后cmake .. -G "MinGW Makefiles"
(从新创建的文件夹中)最后cmake --build .
。它支持OpenMP 4.5,但这个编译器不兼容.lib
(据我所知),而我已经提到这对我来说是必需的。
我尝试过使用clang,但没有成功:
- 来自MSVC的CLANG:
mkdir build-clang-msvc
,然后cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(从新创建的文件夹中),但它失败并显示以下错误:
C++编译器
"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe"
无法编译简单测试程序。
以下是失败的输出:
Change Dir: C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeTmp Run Build Command(s):C:/PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Building CXX object CMakeFiles\cmTC_bd131.dir\testCXXCompiler.cxx.obj [2/2] Linking CXX executable cmTC_bd131.exe FAILED: cmTC_bd131.exe cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_bd131.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~1\MINGW-~1\X86_64~1.0-P\mingw64\bin\ld.exe /nologo CMakeFiles\cmTC_bd131.dir\testCXXCompiler.cxx.obj /out:cmTC_bd131.exe /implib:cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version:0.0 /machine:X86 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." RC Pass 1: command "rc /fo CMakeFiles\cmTC_bd131.dir/manifest.res CMakeFiles\cmTC_bd131.dir/manifest.rc" failed (exit code 0) with the following output: The system cannot find the file specified ninja: build stopped: subcommand failed.
CMake将无法正确生成此项目。 调用栈(最近的调用在最前): CMakeLists.txt:2 (project)
-- 配置不完整,出现错误! 请参阅 "C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log"。 请参阅 "C:/Users/[USER NAME]/source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log"。
除了MSVC,还可以使用Clang和Ninja:
mkdir build-clang-ninja
,然后在新创建的文件夹中更改PATH
环境变量,使非MSVC被优先找到,接着执行cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
。但是会出现以下错误:
-- The CXX compiler identification is Clang 9.0.0 with MSVC-like command-line -- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang-cl.exe -- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang-cl.exe -- broken CMake Error at C:/Program Files/CMake/share/cmake-3.15/Modules/CMakeTestCXXCompiler.cmake:53 (message): The C++ compiler "C:/Program Files/LLVM/bin/clang-cl.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/Users/[USER NAME]/source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeTmp Run Build Command(s):C:/Ninja/ninja.exe cmTC_50b73 && [1/2] Building CXX object CMakeFiles\cmTC_50b73.dir\testCXXCompiler.cxx.obj [2/2] Linking CXX executable cmTC_50b73.exe FAILED: cmTC_50b73.exe cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_50b73.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- CMAKE_LINKER-NOTFOUND /nologo CMakeFiles\cmTC_50b73.dir\testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:cmTC_50b73.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." RC Pass 1: command "rc /fo CMakeFiles\cmTC_50b73.dir/manifest.res CMakeFiles\cmTC_50b73.dir/manifest.rc" failed (exit code 0) with the following output: The system cannot find the file specified ninja: build stopped: subcommand failed.
CMake将无法正确生成此项目。 Call Stack (most recent call first): CMakeLists.txt:2 (project)
-- 配置不完整,出现错误! 请参阅"C:/Users/[USER NAME]/source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log"。 请参阅"C:/Users/[USER NAME]/source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log"。
你对如何使用clang有什么想法吗?我认为这是我实现目标的最佳选择(使用OpenMP 4.5或更高版本编译我的测试程序并生成 .lib
和 .dll
)。
我查看了相关帖子/网页,但它们都没有解决我的问题:
- 使用CMake、Clang和Ninja在Windows上构建C++项目
- 使用CMake、Ninja和Clang在Windows上构建
- 使用Clang在Windows上编译的方法,具体设置链接器:
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- 使用Ninja生成器为Windows(clang-cl)构建CMake
- Clang-cl用户手册
无法找到OpenMP_CXX(缺少:OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
。我会深入研究这个新的错误,如果找不到答案,我会发一个新问题。谢谢! - apalomer