2017-09-25 84 views
2

我使用Homebrew的最新CMake(3.9.3)以及Brew的LLVM 5.0.0,因爲這裏的Clang具有OpenMP支持。MacOS,CMake和OpenMP

這個工作在3.8.2的CMake與LLVM 5.


在我CMakeLists.txt我有

find_package(OpenMP) 

,後來我想這樣做

if(OpenMP_CXX_FOUND) 

但是沒有按的CMake似乎沒有拿起find_package指令。

我運行CMake的與

cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON 

,我已經檢查了正確clangclang++/usr/local/opt/llvm/bin/clang/usr/local/opt/llvm/bin/clang++

我得到的是這兩條線:

-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (found version "1.0") 
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (found version "1.0") 

如果我我自己設置OpenMP_C_FLAGS(使用-DOpenMP_C_FLAGS=-fopenmp=libomp)它將錯誤更改爲

-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1") 

注意,它改變了版本號,所以它一定是在找東西吧?

我錯過了什麼才能正常工作?


好吧,它似乎是由CMake的提供的FindOpenMP.cmake裏面我們做了try_compile,它就會失敗(因爲我們做了很多次,其中大部分會失敗,這是有道理的)。但是,隨着Clang a -Werror標誌被提供,由於未使用的命令行參數而失敗。因此,我可以添加:

if(APPLE) 
    if(CMAKE_C_COMPILER_ID STREQUAL "Clang") 
     set(OpenMP_C_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument") 
    endif() 
    if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") 
     set(OpenMP_CXX_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument") 
    endif() 
endif() 

到我的項目,因爲我知道,-fopenmp=libomp將爲此鏘工作。

這是正確的做法嗎?

+0

是的,LGTM。您可以使用[導入的目標](https://cmake.org/cmake/help/v3.9/module/FindOpenMP.html),讓您的生活變得更輕鬆。 – compor

回答

1

該消息基本上告訴你,你必須提供庫的路徑和庫的名稱。以下示例應該可以解決您的問題(另請參閱find_package(OpenMP))。請注意,我使用命令「brew install llvm」使用brew安裝。前四行只是爲了完整。

set(CMAKE_C_COMPILER "/usr/local/Cellar/llvm/5.0.1/bin/clang") 
set(CMAKE_CXX_COMPILER "/usr/local/Cellar/llvm/5.0.1/bin/clang++") 
set(OPENMP_LIBRARIES "/usr/local/Cellar/llvm/5.0.1/lib") 
set(OPENMP_INCLUDES "/usr/local/Cellar/llvm/5.0.1/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) 

您可能想要設置例如set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread"),以便鏈接器自動檢測適當的pthread庫(請參閱pthreadwiki)。