Мне удалось продублировать эту ошибку для случая Clang + MSVC . Поскольку мы пытаемся использовать специальный компилятор Visual-Studio из-за пределов Visual Studio (то есть из командной строки), необходимо инициализировать среду сборки VS в нашей командной строке перед использованием компилятора. Файлы VCVarsXX.bat
выполняют это;они являются частью инструментов командной строки VS. Таким образом, выбрав вашу архитектуру (x86
, x64
и т. Д.) И запустив сценарий, это должно позволить CMake создать простую тестовую программу с clang-cl
и продолжить. Вот где он находится для VS 2019:
>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- The CXX compiler identification is Clang 8.0.1
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
...
Если говорить о проблеме OpenMP, я лично обнаружил, что использование find_package(OpenMP REQUIRED)
довольно бесполезно. Как вы упомянули, я также получил эту ошибку CMake:
Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
На этом сайте есть несколько предложений (например, здесь и здесь ), утверждающих, что заполнениевсе переменные вручную позволяют FindOpenMP.cmake
успешно найти библиотеки. Я попытался сделать это с вашим примером файла CMake, но с некоторым успехом:
cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)
set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(OpenMP_CXX_LIB_NAMES "libomp" "libiomp5")
set(OpenMP_libomp_LIBRARY libomp)
set(OpenMP_libiomp5_LIBRARY libiomp5)
#OPENMP
find_package(OpenMP REQUIRED)
if(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()
# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
target_link_libraries(example_lib PUBLIC ${OpenMP_CXX_LIBRARIES})
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)
# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)
Это позволило "найти" библиотеки при второй попытке конфигурации CMake (первая всегда выдает ту же ошибку Could NOT find OpenMP_CXX
, что и раньше):
>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- Found OpenMP_CXX: -Xclang -fopenmp (found version "3.1")
-- Found OpenMP: TRUE (found version "3.1")
-- Configuring done
-- Generating done
Однако не удалось создать исполняемый файл, поскольку ни одна из переменных CMake OpenMP (особенно OpenMP_CXX_LIBRARIES
) фактически не указывает на местоположение библиотеки. Недостатки CMake FindOpenMP.cmake
были подняты на сайте выпуска CMake здесь , и, по-видимому, также имеются соответствующие ограничения на стороне LLVM / Clang.
Несмотря ни на что, самым чистым способом, которым я смог заставить пример работать, было полностью отказаться от find_package()
. Следующее позволило мне успешно сгенерировать систему сборки, скомпилировать и запустить исполняемый файл:
cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)
set(OpenMP_LIBRARY_DIR "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/lib")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
# Tell CMake where to find the OpenMP libraries.
link_directories(${OpenMP_LIBRARY_DIR})
# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
# Link in the OpenMP libraries.
target_link_libraries(example_lib PUBLIC libomp libiomp5md)
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)
# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)