Сконфигурируйте CMake в Windows для использования clang из командной строки, чтобы получить современную поддержку OpenMP

11

У меня есть небольшой тестовый проект, который использует OpenMP для распараллеливания. Моя цель - скомпилировать его так, чтобы он создавал .dllи .libдля библиотек (потому что мой реальный проект ссылается на внешние библиотеки, распространяемые с использованием этих типов), с поддержкой OpenMP 4.5 или новее, и делаю это из командной строки, чтобы это можно было сделать в докере для тестирование и проверка (докерская часть выходит за рамки этого вопроса, это просто для справки, почему мне нужно, чтобы она работала из командной строки). Я могу скомпилировать этот проект с разными компиляторами, которые меня не устраивают:

  • MSVC:, mkdir build-msvcзатем cmake ..(из вновь созданной папки) и наконец cmake --build . --config Release. Это прекрасно компилируется, но поддерживает только OpenMP 2.0, поэтому не подходит для моего реального проекта.
  • Intel Parallel Studio:, mkdir build-intelзатем cmake .. -T "Intel C++ Compiler 19.0"(из вновь созданной папки) и наконец cmake --build . --config Release. Это поддерживает OpenMP 5.0, но его лицензии довольно дороги для меня.
  • MinGW x64 g ++:, mkdir build-g++затем cmake .. -G "MinGW Makefiles"(из вновь созданной папки) и наконец cmake --build .. Он поддерживает OpenMP 4.5, но этот компилятор несовместим с .lib(насколько я знаю), который я уже упоминал, мне необходимо.

Я безуспешно пытался использовать Clang:

  • CLANG из MSVC:, mkdir build-clang-msvcзатем cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(из вновь созданной папки), но он завершается ошибкой со следующей ошибкой:
- Идентификатор компилятора CXX - Clang 8.0.1 с MSVC-подобной командной строкой
- Проверьте работающий компилятор CXX: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe
- Проверьте работоспособность компилятора CXX: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - не работает
Ошибка CMake в C: / Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (сообщение):
  Компилятор C ++

    "C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Сообщество / VC / Инструменты / Llvm / bin / clang-cl.exe"

  не может скомпилировать простую тестовую программу.

  Это терпит неудачу со следующим выводом:

    Изменить каталог: C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    Запустите команды построения: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Создание объекта CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] Связывание исполняемого файла CXX cmTC_bd131.exe
    СБОЙ: cmTC_bd131.exe
    cmd.exe / C "cd. &&" C: \ Program Files \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - манифесты - C: \ PROGRA ~ 1 \ MINGW- ~ 1 \ X86_64 ~ 1.0-P \ mingw64 \ bin \ ld.exe / nologo CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj /out:cmTC_bd131.exe / implib: cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version:0.0 / машина: X86 / debug / INCREMENTAL / подсистема: консоль kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib com-ud .lib advapi32.lib && cd. "
    Проход RC 1: команда "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" завершилась неудачно (код выхода 0) со следующим выводом:
    Система не может найти указанный файл
    ниндзя: сборка остановлена: подкоманда не выполнена.





  CMake не сможет правильно сгенерировать этот проект.
Стек вызовов (самый последний вызов сначала):
  CMakeLists.txt: 2 (проект)


- Настройка неполная, произошли ошибки!
См. Также «C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log».
Смотрите также «C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log».
  • Clang и Ninja, кроме MSVC:, mkdir build-clang-ninjaзатем cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(из только что созданной папки и изменяющей PATHпеременную окружения, чтобы сначала находить не-msvc), но это приводит к ошибке со следующей ошибкой:
- Идентификатор компилятора CXX - Clang 9.0.0 с MSVC-подобной командной строкой
- Проверьте работающий компилятор CXX: C: / Program Files / LLVM / bin / clang-cl.exe
- Проверьте работающий компилятор CXX: C: / Program Files / LLVM / bin / clang-cl.exe - не работает
Ошибка CMake в C: / Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (сообщение):
  Компилятор C ++

    "C: / Program Files / LLVM / bin / clang-cl.exe"

  не может скомпилировать простую тестовую программу.

  Это терпит неудачу со следующим выводом:

    Изменить каталог: C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    Запустите команды построения: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Создание объекта CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj
    [2/2] Связывание исполняемого файла CXX cmTC_50b73.exe
    СБОЙ: cmTC_50b73.exe
    cmd.exe / C "cd. &&" C: \ Program Files \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - манифесты - CMAKE_LINKER-NOTFOUND / nologo CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:cmTC_50b73.pdb / версия_версии / 0 / машина: x64 Подсистема: консоль kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. "
    Проход RC 1: команда «rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc» завершилась неудачно (код выхода 0) со следующим выводом:
    Система не может найти указанный файл
    ниндзя: сборка остановлена: подкоманда не выполнена.





  CMake не сможет правильно сгенерировать этот проект.
Стек вызовов (самый последний вызов сначала):
  CMakeLists.txt: 2 (проект)


- Настройка неполная, произошли ошибки!
См. Также «C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log».
См. Также «C: / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log».

Любые идеи о том, как продолжить лязг? Я думаю, что это мой лучший вариант для того, чего я хочу достичь (скомпилировать мою тестовую программу с поддержкой OpenMP 4.5 или новее и производить .libи .dll).

Связанные посты / веб-страницы, которые я проверил, но которые были бесполезны для решения этой проблемы:

apalomer
источник
Вы пытались загрузить соответствующий файл vcvarsXX.bat перед тем, как выполнить команду cmake?
Le Ngoc
Понятия не имею, так что думаю нет. Я просто открываю командную строку, перехожу в папку сборки и выполняю написанные мной команды CMake. Как я могу загрузить этот соответствующий файл?
Апаломер
1
Я работаю с проектом, который строится с MSVC. Всякий раз, когда я хочу построить проект, мне всегда нужно сначала запустить «% VCINSTALLDIR% \ vcvarsall.bat amd64». Также, основываясь на ответе на этой странице stackoverflow.com/questions/22585874/… . Он / она также рекомендует «загрузить соответствующий файл vcvarsXX.bat (например,« <Местоположение Visual Studio> \ VC \ vcvarsall.bat "x86)». Я сталкиваюсь с тем же сообщением об ошибке, что и вы, когда забываю запустить vcvarsall.bat
Le Ngoc
Это определенно заставило меня двигаться вперед. Теперь я застрял на следующем шаге: Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES). Я буду копаться в этой новой ошибке, и если я не найду ответ, я отправлю новый вопрос. Спасибо!
Апаломер

Ответы:

4

Мне удалось продублировать эту ошибку для дела 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)
squareskittles
источник
CMake 3.17 включает поддержку этого, которая решает эту ошибку. Ошибки фиксируются в этом коммите.
Апаломер
@apalomer Спасибо! Если вы знаете более простое решение, пожалуйста, опубликуйте его!
квадратные титры
Запуск vcvarsall.batне помещает Clang-Cl в PATH для меня. Есть идеи почему?
Алекс Рейкинг
@AlexReinking У вас установлен clang-cl? Трудно понять, не зная ваших настроек и того, как вы установили эти компоненты. Я призываю вас задать еще один вопрос, если это необходимо!
квадратные заголовки
Да, он устанавливается через установщик VS2019
Алекс Рейнк