У меня есть небольшой тестовый проект, который использует 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
).
Связанные посты / веб-страницы, которые я проверил, но которые были бесполезны для решения этой проблемы:
- Сборка c ++ проекта для Windows с CMake, Clang и Ninja
- Сборка с CMake, Ninja и Clang на Windows
- Способы компиляции с Clang на Windows , в частности, с настройкой компоновщика:
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- Сборка CMake для Windows (clang-cl) с использованием Ninja Generator
- Clang-cl руководство пользователя
Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
. Я буду копаться в этой новой ошибке, и если я не найду ответ, я отправлю новый вопрос. Спасибо!Ответы:
Мне удалось продублировать эту ошибку для дела Clang + MSVC . Поскольку мы пытаемся использовать специальный компилятор Visual-Studio извне Visual Studio (то есть из командной строки), необходимо инициализировать среду сборки VS в нашей командной строке перед использованием компилятора. Эти
VCVarsXX.bat
файлы достижение этой цели ; они являются частью инструментов командной строки VS. Таким образом, выбрав вашу архитектуру (x86
,x64
и т. Д.) И запустив скрипт, это должно позволить CMake создать простую тестовую программуclang-cl
и продолжить. Вот где он расположен для VS 2019:Если говорить о проблеме OpenMP, я лично нашел, что использование
find_package(OpenMP REQUIRED)
довольно бесплодно. Как вы упомянули, я также получил эту ошибку CMake:На этом сайте есть несколько предложений (например, здесь и здесь ), утверждающих, что заполнение всех переменных вручную позволяет
FindOpenMP.cmake
успешно найти библиотеки. Я попробовал это с вашим примером файла CMake, с некоторым успехом:Это позволило «найти» библиотеки во второй попытке конфигурации CMake (первая всегда выдает ту же
Could NOT find OpenMP_CXX
ошибку, что и раньше):Тем не менее , это не удалось построить исполняемый файл, так как ни одна из переменных CMake OpenMP (в частности
OpenMP_CXX_LIBRARIES
) на самом деле не указывает на местоположение библиотеки. Недостатки CMake годовFindOpenMP.cmake
были подняты на сайте вопрос CMake здесь , и там , как представляется, соответствующие ограничения на конец LLVM / Clang , а также.Несмотря на это, самым чистым способом, которым я смог привести пример в действие, было полное
find_package()
угробление. Следующее позволило мне успешно сгенерировать систему сборки, скомпилировать и запустить исполняемый файл:источник
vcvarsall.bat
не помещает Clang-Cl в PATH для меня. Есть идеи почему?