Налаштуйте CMake у Windows, щоб використовувати кланг із командного рядка, щоб отримати сучасну підтримку 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 від MSVC:, mkdir build-clang-msvcпотім cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(із новоствореної папки), але вона не працює із наступною помилкою:
- Ідентифікація компілятора CXX - Clang 8.0.1 з командним рядком, схожим на MSVC
- Перевірте, чи працює компілятор CXX: C: / Файли програми (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe
- Перевірте наявність компілятора CXX: C: / Файли програми (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - зламано
Помилка CMake на C: / Програмні файли / CMake / share / cmake-3.15 / Модулі / CMakeTestCXXCompiler.cmake: 53 (повідомлення):
  Компілятор C ++

    "C: / Файли програми (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe"

  не в змозі скласти просту програму тестування.

  Виходить з ладу наступний вихід:

    Змінити Dir: C: / Користувачі / [Ім'я користувача] / джерело / 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] Пов’язання виконуваного файлу cmx__dd31.exe CXX
    ПОМИЛО: cmTC_bd131.exe
    cmd.exe / C "cd. &&" C: \ програмні файли \ 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:1.0 / машина: X86 / debug / INCREMENTAL / підсистема: консоль kernel32.lib user32.lib gdi32.lib winpool.lib shell32.lib ole32.lib oleaut32.lib udid.lib .lib advapi32.lib && cd. "
    RC Pass 1: команда "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" не вдалося (код виходу 0) із наступним виходом:
    Система не може знайти вказаний файл
    ninja: збірка зупинена: підкоманда не вдалася.





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


- Налаштування неповних, сталися помилки!
Дивіться також "C: / Users / [NAME NAME] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log".
Дивіться також "C: / Users / [NAME NAME] /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: / Програмні файли / CMake / share / cmake-3.15 / Модулі / CMakeTestCXXCompiler.cmake: 53 (повідомлення):
  Компілятор C ++

    "C: / програмні файли / LLVM / bin / clang-cl.exe"

  не в змозі скласти просту програму тестування.

  Виходить з ладу наступний вихід:

    Змінити Dir: C: / Користувачі / [Ім'я користувача] / джерело / 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] Пов’язання виконуваного файлу cmx_mc_50b73.exe CXX
    ПОМИЛО: cmTC_50b73.exe
    cmd.exe / C "cd. &&" C: \ програмні файли \ 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 /version64.0 / машина: INALX / 0 / INX64.0 / gb / ver6464 de / машина / 2.0 / підсистема: консоль kernel32.lib user32.lib gdi32.lib winpool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. "
    RC Pass 1: команда "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" не вдалося (код виходу 0) із наступним виходом:
    Система не може знайти вказаний файл
    ninja: збірка зупинена: підкоманда не вдалася.





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


- Налаштування неповних, сталися помилки!
Дивіться також "C: / Users / [NAME NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log".
Дивіться також "C: / Users / [NAME NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".

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

Пов’язані публікації / веб-сторінки, які я перевірив, але не корисні для вирішення цього питання:


Ви намагалися завантажити відповідний файл vcvarsXX.bat перед тим, як випустити команду cmake?
Le Ngoc Thuong

Я поняття не маю, тому, мабуть, ні. Я просто відкриваю командний рядок, переходжу до папки збірки та виконую команди, написані нами CMake. Як я можу завантажити цей відповідний файл?
апаломер

1
Я працюю з проектом, який будується з MSVC. Щоразу, коли я хочу створити проект, мені завжди потрібно спершу запустити "% VCINSTALLDIR% \ vcvarsall.bat amd64". Крім того , на основі відповіді на цій сторінці stackoverflow.com/questions/22585874 / ... . Він також рекомендує "завантажити відповідний файл vcvarsXX.bat (наприклад," <Ваше місцезнаходження Visual Studio> \ VC \ vcvarsall.bat "x86)". Я зіткнувся з тим же повідомленням про помилку, що і ви, коли забуду запустити vcvarsall.bat
Le Ngoc Thuong

Це безумовно змусило мене рухатись вперед. Тепер я застряг на наступному кроці: 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)

CMake 3.17 містить підтримку цього, що вирішує цю помилку. Помилки виправлені в цьому коміті.
апаломер

@apalomer Дякую! Якщо ви знаєте більш просте рішення, будь ласка, опублікуйте його!
квадратики

Біг vcvarsall.batне додає clang-cl в PATH для мене. Будь-яка ідея чому?
Алекс Рейнкінг

@AlexReinking У вас встановлений clang-cl? Важко дізнатися, не знаючи, що ти налаштував і як ти встановив ці компоненти. Я закликаю вас поставити ще одне питання, якщо це необхідно!
squareskittles

Так, він встановлений через інсталятор VS2019
Алекс Рейнкінг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.