CMake Unterstützung für OpenMP auf macOS High Sierra

Ich bin versucht hinzuzufügen, OpenMP zu einem Projekt, das Gebäude mit CMake. Ich habe kein problem, bauen es auf Linux mit der standard-CMake/OpenMP neben:

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()

Leider nicht zu funktionieren scheint auf macOS Ziele. Wenn cmake aufgerufen wird, wird die folgende Fehlermeldung gegeben:

-- 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) 

Ich bin mit macOS High Sierra (10.13.3) zusammen mit CMake 3.11. Ich habe installiert OpenMP 5.01 via brew, ‚brew install libomp‘. Ich habe festgestellt, dass einige frühere Beiträge zu kommentieren, auf Fragen in Bezug auf diese drei, aber Sie alle scheinen sich mit einer früheren Art der Installation von OpenMP auf macOS, „brew install clang-omp“.

Ich denke das könnte etwas damit zu tun haben CMake keine Unterstützung für diese OpenMP installieren, wie ich in der Lage bin, zu benutzen, OpenMP kein problem mit standard-makefiles. Alle Informationen wäre sehr geschätzt werden.

InformationsquelleAutor David S. | 2018-04-09



2 Replies
  1. 3

    Ich hatte das gleiche problem und es dauerte einen ganzen Tag um die Lösung zu finden. Ich bin mit Mac-Sierra 10.13.4. Ich will Opencv3 (ich denke, das gleiche problem scheint auch für opencv2) und openMP. Ich war eigentlich mit Clion als IDE (CLion verwendet cmake konfigurieren Sie das Projekt im Gegensatz zu anderen IDE), so habe ich zu schreiben CMakeLists.txt Datei.

    Gab es einen Konflikt mit gcc als compiler für openCV und openMP. Wenn man gcc als compiler dann gibt es Fehler für opencv als :

    imwrite() auf OS X Fehler: Undefined Symbole
    Sie müssen gezielt llvm-Compilers auf OS X um dieses Problem zu beheben. Folgenden, ich gebe den richtigen code für die Verwendung von OpenCV und OpenMP auf Mac-Sierra:

    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/[email protected]/")
    
    set(OpenCV_INCLUDE_DIRS "/usr/local/Cellar/[email protected]/include/")
    set(OpenCV_LIBS "/usr/local/Cellar/[email protected]/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)
    

    Möchten Sie vielleicht zu setzen, z.B. set(CMAKE_EXE_LINKER_FLAGS „${CMAKE_EXE_LINKER_FLAGS} -lpthread“), so dass der linker erkennt automatisch die entsprechende pthread-Bibliothek

    Tun

    brew installieren llvm

    installieren llvm-compiler.
    Bitte beachten Sie, dass Sie nicht verwenden können, den gcc-compiler auf dem Mac-Sierra für Ihr Projekt die Bedürfnisse openMP und auch openCV. Sie müssen verwenden llvm-compiler.

    Überprüfen Sie die korrekte Lage des llvm-und openCV-installation directory.

  2. 3

    Ich habe in der Lage, Antwort auf meine eigene Frage (Entschuldigung für nicht herauszufinden dieses heraus im Voraus, hoffentlich kann dies helfen, andere mit dem gleichen Problem).

    Scheint es, dass ein patch eingereicht wurde, CMake, um es zu ermöglichen, um richtig zu erstellen buildsysteme ins mit den neuen OpenMP installieren: https://gitlab.kitware.com/cmake/cmake/merge_requests/1812

    Für andere zu sehen, dies in der Zukunft, update auf CMake 3.12 wenn es veröffentlicht wurde, in der Zeit zu Lesen.

    • Ich war in der gleichen situation wie @spandan, die sich auf CLion zum kompilieren meine Pakete. Ihre Lösung (brew upgrade cmake -v) arbeitete für mich auch. Importieren von OpenMP ist so einfach wie dieses Handbuch schlägt vor.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.