OpenMP

OpenMP#

在 CMake 3.9+ 中,OpenMP 的支持得到了大幅改进。将 OpenMP 添加到目标的现代(TM)方法是:

find_package(OpenMP)
if(OpenMP_CXX_FOUND)
    target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX)
endif()

这种方法不仅比旧方法更简洁,而且如果需要,它还会正确地设置库链接行与编译行不同。在 CMake 3.12+ 中,这甚至支持 macOS 上的 OpenMP(如果库可用,例如使用 brew install libomp )。然而,如果你需要支持较旧的 CMake,以下方法适用于 CMake 3.1+:

# For CMake < 3.9, we need to make the target ourselves
if(NOT TARGET OpenMP::OpenMP_CXX)
    find_package(Threads REQUIRED)
    add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE)
    set_property(TARGET OpenMP::OpenMP_CXX
                 PROPERTY INTERFACE_COMPILE_OPTIONS ${OpenMP_CXX_FLAGS})
    # Only works if the same flag is passed to the linker; use CMake 3.9+ otherwise (Intel, AppleClang)
    set_property(TARGET OpenMP::OpenMP_CXX
                 PROPERTY INTERFACE_LINK_LIBRARIES ${OpenMP_CXX_FLAGS} Threads::Threads)

endif()
target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX)

危险

CMake < 3.4 在 Threads 包中存在错误,需要启用 C 语言。