Cmake在Maverick上无法与OpenMP一起使用。

7

我正在使用OpenMP编写并行代码。以下是我在CMakeLists中使用的一部分。

FIND_PACKAGE( OpenMP REQUIRED)
    if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
    endif()

然而,当我们执行 cmake .. 时,似乎找不到 OpenMP 包,我收到了以下错误提示:

Try OpenMP C flag = [ ]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [/openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-Qopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-xopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [+Oopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-qsmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP C flag = [-mp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [ ]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [/openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-Qopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-openmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-xopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [+Oopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-qsmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
-- Try OpenMP CXX flag = [-mp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
CMake Error at /opt/local/share/cmake-3.3/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS)

这里是CMakeLists.txt。
cmake_minimum_required(VERSION 2.6)

#Declaration du projet

project(MYfirstcamke)

set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})

#Inclusion de opencv

include_directories(/usr/local/include/)

link_directories(/usr/local/lib)

FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

file(

    GLOB_RECURSE

    source_files

    src/*


)
#declaration de l'executable

add_executable(

my_executable

${source_files}

)
#Configuration de l'edition de lien.
target_link_libraries(

my_executable opencv_core  opencv_imgproc opencv_video opencv_highgui ${PCL_LIBRARIES}


)

我该如何修复这个问题?我确定已经安装了openMPI,并且它位于/opt/local/include目录下。

2
你确定你没有混淆OpenMP和OpenMPI吗?我看到你使用了两个标签,并且在帖子末尾提到了OpenMPI。但是这两者完全不同。OpenMP是多线程并行语言扩展的标准,而OpenMPI是用于消息传递的MPI标准的实现。你需要哪一个? - Gilles
OpenMP不是一个软件包,而是编译器的一个组成部分。很久以前,Xcode曾经提供过支持OpenMP的GCC版本。然后,苹果转向了Clang,但它没有OpenMP支持,至少在随Xcode一起发布的版本中没有。你应该从源代码或使用Homebrew/MacPorts/其他方式安装GCC。 - Hristo Iliev
@Gilles,也许我混淆了OpenMP和OpenMPI。我认为OpenMP已经被弃用并变成了OpenMPI。 - Jeanne
@HristoIliev,我已经安装了GCC,但是我该如何在CMakeLists.txt中指定编译器。我已经将CMakeLists.txt文件添加到我的问题中。 - Jeanne
我不太理解CMake,但在运行CMake之前,可能需要执行类似于export CC=gcc-4.9; export CXX=g++-4.9的操作。请将gxx-4.9替换为相应编译器的实际名称。 - Hristo Iliev
3个回答

0

OpenMP和MPI是完全不同的东西。

OMP需要编译器支持,在OS X上需要通过Homebrew获取。(你也可以通过Homebrew安装MPI,这很方便)。

brew install clang-omp

在安装了clang-omp之后,您可以通过以下方式调用CMake来使用该编译器。

CC=clang-omp CXX=clang-omp++ cmake <insert your normal cmake parameters here>

根据http://openmp.llvm.org/的说法,
“随着Clang 3.8.0的发布,Clang默认启用了OpenMP 3.1支持,因此OpenMP运行时作为Clang构建的正常部分构建”
我不明白为什么我仍然需要安装“clang-omp”,您能否解释一下原因?另一个问题是,“clang-omp”公式要求使用与“llvm”公式不同版本的clang(和“compiler-rt”等),那么我该怎么做才能使事情变得正确?
- squid
我正在尝试使用CMake 3.7和clang 4.0,但我的find_package(OpenMP REQUIRED)失败了。 - David Doria

0
一种解决方案是安装并使用GNU GCC。假设您已经安装了它或将通过HomeBrew进行安装brew install gcc
if(APPLE)
  set(CMAKE_C_COMPILER "/usr/local/bin/gcc-9")
  set(CMAKE_CXX_COMPILER "/usr/local/bin/g++-9")
  set(CMAKE_Fortran_COMPILER "/usr/local/bin/gfortran")
endif()

-9版本可能会在未来发生变化。


0
除了上面的答案,你还可以通过Homebrew安装gcc-5/g++-5。纯粹的gcc-5安装(没有Clang包装器)将支持OpenMP,并且CMake应该能够通过Find_Package来检测到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接