【问题标题】:CMake Support for OpenMP on macOS High SierraCMake 支持 macOS High Sierra 上的 OpenMP
【发布时间】:2018-04-09 18:00:09
【问题描述】:

我正在尝试将 OpenMP 添加到使用 CMake 构建的项目中。使用标准 CMake/OpenMP 添加在 Linux 上构建它没有问题:

find_package(OpenMP)
if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} 
${OpenMP_EXE_LINKER_FLAGS}")
endif()

不幸的是,这似乎不适用于 macOS 目标。调用cmake时报如下错误:

-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS) 
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS) 
-- Could NOT find OpenMP (missing: OpenMP_C_FOUND OpenMP_CXX_FOUND) 

我正在使用 macOS High Sierra (10.13.3) 和 CMake 3.11。我已经通过 brew 安装了 OpenMP 5.01,“brew install libomp”。我发现一些以前的帖子评论了关于这三个问题的问题,但它们似乎都处理以前在 macOS 上安装 OpenMP 的方式,“brew install clang-omp”。

我认为这可能与 CMake 不支持此 OpenMP 安装有关,因为我可以使用 OpenMP 与标准 makefile 没有问题。提供的任何信息将不胜感激。

【问题讨论】:

    标签: macos cmake openmp


    【解决方案1】:

    我已经能够回答我自己的问题(很抱歉没有事先弄清楚这一点,希望这可以帮助其他人解决同样的问题)。

    似乎已向 CMake 提交了一个补丁,以允许它使用新的 OpenMP 安装正确创建构建系统:https://gitlab.kitware.com/cmake/cmake/merge_requests/1812

    如果其他人在未来看到这一点,请更新到 CMake 3.12(如果它在阅读时已发布)。

    【讨论】:

    • 我和@spandan 的情况一样,依靠 CLion 来编译我的包。您的解决方案 (brew upgrade cmake -v) 也对我有用。导入 OpenMP 就像 this guide suggests 一样简单。
    【解决方案2】:

    我遇到了同样的问题,花了一整天的时间才找到解决方案。我正在使用 Mac-Sierra 10.13.4。我想使用Opencv3(我认为同样的问题也出现在opencv2)和openMP。我实际上是使用 Clion 作为 IDE(CLion 使用 cmake 来配置项目,不像其他 IDE),所以我必须编写 CMakeLists.txt 文件。

    使用 gcc 作为 openCV 和 openMP 的编译器存在冲突。如果您使用 gcc 作为编译器,那么它会为 opencv 提供错误:

    imwrite() on OS X 错误:未定义符号 您需要在 OS X 上专门使用 llvm 编译器来解决此问题。接下来,我给出了在 Mac-Sierra 上使用 OpenCV 和 OpenMP 的正确代码:

    cmake_minimum_required(VERSION 3.10)
    project(MyOpenCVTest)
    
    set(CMAKE_CXX_STANDARD 11)
    
    add_executable(MyOpenCVTest main.cpp)
    
    # set("OpenCV_DIR" "/modules/opencv/3.4.1/share/OpenCV/")
    set(CMAKE_PREFIX_PATH "/usr/local/Cellar/opencv@3/")
    
    set(OpenCV_INCLUDE_DIRS "/usr/local/Cellar/opencv@3/include/")
    set(OpenCV_LIBS "/usr/local/Cellar/opencv@3/lib/")
    
    find_package(OpenCV REQUIRED)
    
    message(STATUS "OpenCV library status:")
    message(STATUS "    version: ${OpenCV_VERSION}")
    message(STATUS "    libraries: ${OpenCV_LIBS}")
    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
    
    if(UNIX)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
    endif()
    
    
    set(CMAKE_C_COMPILER "/usr/local/Cellar/llvm/6.0.0/bin/clang")
    set(CMAKE_CXX_COMPILER "/usr/local/Cellar/llvm/6.0.0/bin/clang++")
    set(OPENMP_LIBRARIES "/usr/local/Cellar/llvm/6.0.0/lib")
    set(OPENMP_INCLUDES "/usr/local/Cellar/llvm/6.0.0/include")
    
    OPTION (USE_OpenMP "Use OpenMP to enamble <omp.h>" ON)
    
    # Find OpenMP
    if(APPLE AND USE_OpenMP)
        if(CMAKE_C_COMPILER_ID MATCHES "Clang")
            set(OpenMP_C "${CMAKE_C_COMPILER}")
            set(OpenMP_C_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
            set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
            set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})
            set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})
            set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})
        endif()
        if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
            set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
            set(OpenMP_CXX_FLAGS "-fopenmp=libomp -Wno-unused-command-line-argument")
            set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
            set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
            set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})
            set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})
        endif()
    endif()
    
    if(USE_OpenMP)
        find_package(OpenMP REQUIRED)
    endif(USE_OpenMP)
    
    if (OPENMP_FOUND)
        include_directories("${OPENMP_INCLUDES}")
        link_directories("${OPENMP_LIBRARIES}")
        set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
        set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
        # set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
    endif(OPENMP_FOUND)
    
    
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    target_link_libraries( MyOpenCVTest ${OpenCV_LIBS})
    TARGET_LINK_LIBRARIES(MyOpenCVTest opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
    

    您可能想要设置例如set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread") 以便链接器自动检测适当的 pthread 库

    brew 重新安装 llvm

    安装 llvm 编译器。 请注意,对于需要 openMP 和 openCV 的项目,您不能在 Mac-Sierra 上使用 gcc 编译器。你需要使用llvm编译器。

    验证llvm和openCV安装目录的位置是否正确。

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 2018-07-21
      • 2018-10-23
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2018-06-11
      • 2018-01-27
      相关资源
      最近更新 更多