带有Clang,CMake和Ninja的Windows上的OpenMP 4.5

时间:2019-04-01 11:26:19

标签: c++ windows cmake clang openmp

我试图在Windows上使用OpenMP 4.5,但MSVC似乎不支持OpenMP> 2.0

我发现Clang支持OpenMP 4.5,但是我无法使其在Windows上运行。

我安装了Visual Studio 2017,Clang 8.0.0和CMake 3.13。

要构建我的CMake项目,请致电:

try:
    raise ZeroDivisionError()
except ZeroDivisionError as e:
    try:
        raise TypeError() from e
    except Exception as ex:
        if type(ex.__cause__) is ZeroDivisionError:
            print('ZeroDivisionError')
        else:
            raise  # re-raise exception if it has different __cause__

但是找不到OpenMP:

cmake .. -G Ninja -DCMAKE_C_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe"  -DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER:PATH="C:/Program Files/LLVM/bin/lld-link.exe"

如果我仅使用 clang (clang.exe和clang ++。exe而不是clang-cl.exe)进行构建,它将找到Clang的OpenMP库(OpenMP 5.0)

如果我仅使用 MSVC 进行构建,它将找到OpenMP 2.0

但是使用 clang-cl.exe 时,找不到OpenMP(两个版本)

有没有一种方法可以使OpenMP 4.5在Windows上运行?

谢谢

1 个答案:

答案 0 :(得分:0)

您尚未发布CMake的示例,因此在这里我不做任何推测。如果您使用的是find_package(OpenMP REQUIRED),那么从Visual Studio中使用clang-cl时,我也会收到类似的错误消息。已知limitations带有CMake的FindOpenMP.cmake模块,并且在clang-cl方面缺乏支持。该站点上还有其他answers条建议手动填充CMake OpenMP_变量,但这似乎是倒退的,我的成功有限。我能够成功运行CMake,然后通过避免使用find_package并使用MSVC + Clang编译我的应用程序,并且暂时避免了对OpenMP库的路径进行硬编码:

cmake_minimum_required (VERSION 3.10)
project(MyOpenMPTest LANGUAGES CXX)

set(OpenMP_LIBRARY_DIR "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/Llvm/lib")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

# Tell CMake where to find the OpenMP libraries.
link_directories(${OpenMP_LIBRARY_DIR})

# Library
add_library(MyLibrary SHARED MyExample.h MyExample.cpp)
# Link in the OpenMP libraries.
target_link_libraries(MyLibrary PUBLIC libomp libiomp5md)

# Executable
add_executable(MyOpenMpTest MyOpenMpTest .cpp)
target_link_libraries(MyOpenMpTest MyLibrary)

希望CMake和LLVM的人们将很快解决此问题,并且FindOpenMP.cmake可以更可靠地使用。