Konfigurasikan CMake di windows untuk menggunakan dentang dari baris perintah untuk mendapatkan dukungan OpenMP modern

11

Saya punya proyek uji kecil yang menggunakan OpenMP untuk paralelisasi. Target saya adalah untuk mengkompilasinya sehingga menghasilkan .dlldan .libuntuk perpustakaan (karena tautan proyek saya yang sebenarnya ke perpustakaan eksternal yang didistribusikan menggunakan jenis ini), dengan dukungan untuk OpenMP 4.5 atau yang lebih baru dan melakukannya dari baris perintah sehingga dapat dilakukan pada buruh pelabuhan untuk menguji dan memeriksa (bagian buruh pelabuhan keluar dari ruang lingkup pertanyaan ini, itu hanya untuk referensi mengapa saya membutuhkannya untuk bekerja dari baris perintah). Saya dapat mengkompilasi proyek ini dengan kompiler yang berbeda dengan yang saya tidak senang:

  • MSVC:, mkdir build-msvclalu cmake ..(dari folder yang baru dibuat) dan akhirnya cmake --build . --config Release. Ini mengkompilasi dengan baik tetapi hanya mendukung OpenMP 2.0, oleh karena itu bukan pilihan yang baik untuk proyek nyata saya.
  • Intel Parallel Studio:, mkdir build-intellalu cmake .. -T "Intel C++ Compiler 19.0"(dari folder yang baru dibuat) dan akhirnya cmake --build . --config Release. Ini mendukung OpenMP 5.0 tetapi lisensinya cukup mahal bagi saya.
  • MinGW x64 g ++:, mkdir build-g++lalu cmake .. -G "MinGW Makefiles"(dari folder yang baru dibuat) dan akhirnya cmake --build .. Ini mendukung OpenMP 4.5 tetapi kompiler ini tidak kompatibel dengan .lib(sejauh yang saya tahu) yang telah saya sebutkan diperlukan untuk saya.

Saya telah mencoba tanpa berhasil menggunakan dentang:

  • CLANG dari MSVC:, mkdir build-clang-msvcthen cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(dari folder yang baru dibuat), tetapi gagal dengan kesalahan berikut:
- Identifikasi kompiler CXX adalah Dentang 8.0.1 dengan baris perintah seperti MSVC
- Periksa apakah kompiler CXX berfungsi: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Komunitas / VC / Tools / Llvm / bin / clang-cl.exe
- Periksa apakah kompiler CXX berfungsi: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Komunitas / VC / Tools / Llvm / bin / clang-cl.exe - rusak
Kesalahan CMake di C: / Program Files / CMake / share / cmake-3.15 / Modul / CMakeTestCXXCompiler.cmake: 53 (pesan):
  Kompiler C ++

    "C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Komunitas / VC / Alat / Llvm / bin / clang-cl.exe"

  tidak dapat menyusun program pengujian sederhana.

  Gagal dengan output berikut:

    Ubah Dir: C: / Pengguna / [NAMA PENGGUNA] / sumber / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    Jalankan Bangun Perintah: C: /PROGRA ~ 2/MICROS ~ 1/2019/COMMUN ~ 1/Common7/IDE/COMMON ~ 1/MICROS ~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Membangun objek CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] Menghubungkan cmX yang dapat dieksekusi cmTC_bd131.exe
    GAGAL: 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 - manifes - 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 /versiion.0.0 / mesin: X86 / debug / INCREMENTAL / subsistem: konsol kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32 .lib advapi32.lib && cd. "
    RC Pass 1: perintah "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" gagal (kode keluar 0) dengan output berikut:
    Sistem tidak dapat menemukan berkas yang dicari
    ninja: build stops: subcommand gagal.





  CMake tidak akan dapat menghasilkan proyek ini dengan benar.
Penumpukan Panggilan (panggilan terakhir):
  CMakeLists.txt: 2 (proyek)


- Mengonfigurasi tidak lengkap, terjadi kesalahan!
Lihat juga "C: / Pengguna / [NAMA PENGGUNA] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log".
Lihat juga "C: / Users / [USER NAME] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
  • Dentang dan Ninja terpisah dari MSVC:, mkdir build-clang-ninjalalu cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(dari folder yang baru dibuat dan mengubah PATHvariabel lingkungan sehingga non-msvc ditemukan terlebih dahulu), tetapi gagal dengan kesalahan berikut:
- Identifikasi kompiler CXX adalah Dentang 9.0.0 dengan baris perintah seperti MSVC
- Periksa apakah kompiler CXX berfungsi: C: / Program Files / LLVM / bin / clang-cl.exe
- Periksa apakah kompiler CXX berfungsi: C: / Program Files / LLVM / bin / clang-cl.exe - rusak
Kesalahan CMake di C: / Program Files / CMake / share / cmake-3.15 / Modul / CMakeTestCXXCompiler.cmake: 53 (pesan):
  Kompiler C ++

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

  tidak dapat menyusun program pengujian sederhana.

  Gagal dengan output berikut:

    Ubah Dir: C: / Pengguna / [NAMA PENGGUNA] / sumber / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    Jalankan Bangun Perintah: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Membangun objek CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj
    [2/2] Menautkan cmX yang dapat dieksekusi cmTC_50b73.exe
    GAGAL: 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 - manifes - CMAKE_LINKER-NOTFOUND / nologo CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:cmTC_50b73.pdb / version /.0 / mesin: debug subsistem: konsol kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. "
    RC Pass 1: perintah "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" gagal (kode keluar 0) dengan output berikut:
    Sistem tidak dapat menemukan berkas yang dicari
    ninja: build stops: subcommand gagal.





  CMake tidak akan dapat menghasilkan proyek ini dengan benar.
Penumpukan Panggilan (panggilan terakhir):
  CMakeLists.txt: 2 (proyek)


- Mengonfigurasi tidak lengkap, terjadi kesalahan!
Lihat juga "C: / Pengguna / [NAMA PENGGUNA] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log".
Lihat juga "C: / Pengguna / [NAMA PENGGUNA] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".

Ada ide tentang bagaimana untuk melanjutkan dentang? Saya pikir itu adalah pilihan terbaik saya untuk apa yang ingin saya capai (mengkompilasi program pengujian saya dengan dukungan untuk OpenMP 4.5 atau yang lebih baru dan memproduksi .libdan .dll).

Posting terkait / halaman web yang telah saya periksa tetapi tidak berguna untuk menyelesaikan ini:

apalomer
sumber
Apakah Anda mencoba memuat file vcvarsXX.bat yang relevan sebelum mengeluarkan perintah cmake?
Le Ngoc Thuong
Saya tidak tahu, jadi saya rasa tidak. Saya baru saja membuka command prompt, arahkan ke folder build dan jalankan perintah CMake yang saya tulis. Bagaimana saya bisa memuat file yang relevan ini?
apalomer
1
Saya bekerja dengan proyek yang dibuat dengan MSVC. Setiap kali saya ingin membangun proyek, saya selalu harus menjalankan "% VCINSTALLDIR% \ vcvarsall.bat amd64" terlebih dahulu. Juga, berdasarkan jawaban di halaman ini stackoverflow.com/questions/22585874/… . Ia juga merekomendasikan agar "memuat file vcvarsXX.bat yang relevan (mis." <Lokasi Visual Studio Anda> \ VC \ vcvarsall.bat "x86)". Saya telah menghadapi pesan kesalahan yang sama seperti Anda ketika saya lupa menjalankan vcvarsall.bat
Le Ngoc Thuong
Itu pasti membuat saya bergerak maju. Sekarang saya terjebak di langkah berikutnya: Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES). Saya akan menggali kesalahan baru ini dan jika saya tidak menemukan jawaban saya akan memposting pertanyaan baru. Terima kasih!
apalomer

Jawaban:

4

Saya bisa menduplikasi kesalahan ini untuk kasus Dentang + MSVC . Karena kami mencoba menggunakan kompiler yang dibuat Visual-Studio dari luar Visual Studio (yaitu baris perintah), maka perlu menginisialisasi lingkungan build VS di baris perintah kami sebelum menggunakan kompiler. The VCVarsXX.batfile mencapai hal ini; mereka adalah bagian dari alat Command Prompt VS. Jadi dengan memilih arsitektur Anda ( x86,, x64dll) dan menjalankan skrip, ini akan memungkinkan CMake untuk membangun program pengujian sederhana dengan clang-cldan melanjutkan. Di sinilah lokasinya untuk 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
...

Untuk memperluas masalah OpenMP, saya pribadi merasa find_package(OpenMP REQUIRED)tidak berguna. Seperti yang Anda sebutkan, saya juga menerima kesalahan CMake ini:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

Ada beberapa saran di situs ini (misalnya di sini dan di sini ) mengklaim bahwa mengisi semua variabel secara manual memungkinkan FindOpenMP.cmakeuntuk berhasil menemukan perpustakaan. Saya mencoba ini dengan contoh file CMake Anda, dengan beberapa keberhasilan:

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)

Ini berhasil "menemukan" perpustakaan pada upaya konfigurasi CMake kedua (yang pertama selalu menghasilkan Could NOT find OpenMP_CXXkesalahan yang sama seperti sebelumnya):

>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

Namun , ini gagal membangun executable, karena tidak ada variabel CMake OpenMP (khususnya OpenMP_CXX_LIBRARIES) yang benar-benar menunjuk ke lokasi perpustakaan. Kekurangan CMake FindOpenMP.cmaketelah diangkat di situs masalah CMake di sini , dan tampaknya ada batasan yang relevan pada akhir LLVM / Dentang juga.


Bagaimanapun juga, cara terbersih saya untuk membuat contoh bekerja adalah dengan membuang find_package()semuanya. Berikut ini memungkinkan saya untuk berhasil menghasilkan sistem builds, dan mengkompilasi dan menjalankan executable:

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)
kotak squareskittles
sumber
CMake 3.17 menggabungkan dukungan untuk ini yang memecahkan kesalahan ini. Kesalahan diperbaiki dalam komit ini .
apalomer
@apalomer Terima kasih! Jika Anda tahu solusi yang lebih sederhana, silakan kirim satu!
squareskittles
Berlari vcvarsall.battidak menempatkan clang-cl di PATH untuk saya. Ada yang tahu kenapa?
Alex Reinking
@AlexReinking Apakah Anda memiliki clang-cl diinstal? Sulit diketahui tanpa mengetahui pengaturan Anda dan bagaimana Anda menginstal komponen-komponen ini. Saya mendorong Anda untuk mengajukan pertanyaan lain, jika perlu!
squareskittles
Ya, itu diinstal melalui penginstal VS2019
Alex Reinking