Modern OpenMP desteği almak için CMake'i Windows'ta komut satırından clang kullanacak şekilde yapılandırın


11

Paralelleştirme için OpenMP kullanan küçük bir test projem var. Amacım bunu üretecek şekilde .dllve .libkütüphaneler için derlemektir (çünkü gerçek projem bu türler kullanılarak dağıtılan harici kütüphanelere bağlanır), OpenMP 4.5 veya daha yeni bir desteğiyle bunu yapmak ve komut satırından bunu yapmak için bir docker'da yapılabilir. test etme ve kontrol etme (docker kısmı bu sorunun kapsamı dışındadır, sadece komut satırından neden çalışmam gerektiğine dair referans içindir). Bu projeyi mutlu olmadığım farklı derleyicilerle derleyebilirim:

  • MSVC:, mkdir build-msvcsonra cmake ..(yeni oluşturulan klasörden) ve son olarak cmake --build . --config Release. Bu iyi derlenir, ancak yalnızca OpenMP 2.0'ı destekler, bu nedenle gerçek projem için iyi bir seçenek değildir.
  • Intel Parallel Studio:, mkdir build-intelsonra cmake .. -T "Intel C++ Compiler 19.0"(yeni oluşturulan klasörden) ve son olarak cmake --build . --config Release. Bu OpenMP 5.0'ı destekliyor ancak lisansları benim için oldukça pahalı.
  • MinGW x64 g ++:, mkdir build-g++sonra cmake .. -G "MinGW Makefiles"(yeni oluşturulan klasörden) ve son olarak cmake --build .. OpenMP 4.5'i destekliyor, ancak bu derleyici .libbenim için gerekli olduğunu belirttiğim (bildiğim kadarıyla) ile uyumlu değil .

Clang kullanmak için başarılı olmadan denedim:

  • MSVC'den CLANG:, mkdir build-clang-msvcsonra cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(yeni oluşturulan klasörden), ancak aşağıdaki hatayla başarısız olur:
- CXX derleyici kimliği, MSVC benzeri komut satırı ile Clang 8.0.1'dir
- CXX derleyicisinin çalışıp çalışmadığını kontrol edin: C: / Program Dosyaları (x86) / Microsoft Visual Studio / 2019 / Topluluk / VC / Araçlar / Llvm / bin / clang-cl.exe
- CXX derleyicisinin çalışıp çalışmadığını kontrol edin: C: / Program Dosyaları (x86) / Microsoft Visual Studio / 2019 / Topluluk / VC / Araçlar / Llvm / bin / clang-cl.exe - bozuk
C: / Program Dosyaları / CMake / share / cmake-3.15 / Modüller / CMakeTestCXXCompiler.cmake: 53 (mesaj):
  C ++ derleyicisi

    "C: / Program Dosyaları (x86) / Microsoft Visual Studio / 2019 / Topluluk / VC / Araçlar / Llvm / bin / clang-cl.exe"

  basit bir test programını derleyemez.

  Aşağıdaki çıktı ile başarısız olur:

    Değişiklik Yönü: C: / Kullanıcılar / [KULLANICI ADI] / kaynak / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    Derleme Komutlarını Çalıştır: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] CXX nesnesi oluşturma CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] CXX yürütülebilir cmTC_bd131.exe dosyasını bağlama
    BAŞARISIZ: cmTC_bd131.exe
    cmd.exe / C "cd. &&" C: \ Program Dosyaları \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifests - 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 / makine: X86 / hata ayıklama / INCREMENTAL / alt sistem: konsol kernel32.lib user32.lib gdi32.lib winspool.lib kabuk32.lib ole32.lib oleaut32.lib uuid.lib comdlg32 .lib advapi32.lib && cd. "
    RC Pass 1: "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" komutu aşağıdaki çıktı ile başarısız oldu (çıkış kodu 0):
    Sistem belirtilen dosyayı bulamıyor
    ninja: derleme durduruldu: alt komut başarısız.





  CMake bu projeyi doğru bir şekilde oluşturamayacaktır.
Çağrı Yığını (en son yapılan ilk çağrı):
  CMakeLists.txt: 2 (proje)


- Yapılandırma tamamlanmadı, hatalar oluştu!
Ayrıca bkz. "C: / Kullanıcılar / [KULLANICI ADI] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log".
Ayrıca bkz. "C: / Kullanıcılar / [KULLANICI ADI] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
  • Clang ve Ninja, MSVC dışında:, mkdir build-clang-ninjasonra cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(yeni oluşturulan klasörden ve PATHçevre değişkenini değiştirmek için önce msvc olmayan bulunur), ancak aşağıdaki hatayla başarısız olur:
- CXX derleyici kimliği, MSVC benzeri komut satırı ile Clang 9.0.0'dır
- CXX derleyicisinin çalışıp çalışmadığını kontrol edin: C: / Program Dosyaları / LLVM / bin / clang-cl.exe
- CXX derleyicisinin çalışıp çalışmadığını kontrol edin: C: / Program Dosyaları / LLVM / bin / clang-cl.exe - bozuk
C: / Program Dosyaları / CMake / share / cmake-3.15 / Modüller / CMakeTestCXXCompiler.cmake: 53 (mesaj):
  C ++ derleyicisi

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

  basit bir test programını derleyemez.

  Aşağıdaki çıktı ile başarısız olur:

    Değişiklik Yönü: C: / Kullanıcılar / [KULLANICI ADI] / kaynak / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    Derleme Komutlarını Çalıştır: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Cake nesnesi CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj oluşturma
    [2/2] CXX yürütülebilir cmTC_50b73.exe dosyasını bağlama
    BAŞARISIZ: cmTC_50b73.exe
    cmd.exe / C "cd. &&" C: \ Program Dosyaları \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifests - 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.0 / makine: x64 / debug / INCREMENT alt sistem: 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: "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" komutu aşağıdaki çıktı ile başarısız oldu (çıkış kodu 0):
    Sistem belirtilen dosyayı bulamıyor
    ninja: derleme durduruldu: alt komut başarısız.





  CMake bu projeyi doğru bir şekilde oluşturamayacaktır.
Çağrı Yığını (en son yapılan ilk çağrı):
  CMakeLists.txt: 2 (proje)


- Yapılandırma tamamlanmadı, hatalar oluştu!
Ayrıca bkz. "C: / Kullanıcılar / [KULLANICI ADI] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log".
Ayrıca bkz. "C: / Kullanıcılar / [KULLANICI ADI] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".

Clang ile nasıl devam edileceğine dair bir fikrin var mı? Ben başarmak istediğim şey için en iyi seçenek olduğunu düşünüyorum (test programımı OpenMP 4.5 veya daha yeni ve üreten .libve destek ile derlemek .dll).

İlgili yayınları / web sayfalarını kontrol ettim ancak bunu çözmek için yararlı olmadı:


Cmake komutunu vermeden önce ilgili vcvarsXX.bat dosyasını yüklemeye çalıştınız mı?
Le Ngoc Thuong

Hiçbir fikrim yok, bu yüzden sanmıyorum. Sadece bir komut istemi açıyorum, derleme klasörüne gidiyorum ve yazdığım CMake komutlarını yürütüyorum. Bu ilgili dosyayı nasıl yükleyebilirim?
apalomer

1
MSVC ile oluşturulan bir proje ile çalışıyorum. Projeyi ne zaman inşa etmek istersem, her zaman önce "% VCINSTALLDIR% \ vcvarsall.bat amd64" komutunu çalıştırmam gerekir. Ayrıca, bu sayfadaki cevaba dayanarak stackoverflow.com/questions/22585874/… . Ayrıca "ilgili vcvarsXX.bat dosyasını yüklemenizi önerir (örn." <Visual Studio konumunuz> \ VC \ vcvarsall.bat "x86)". Vcvarsall.bat'ı çalıştırmayı unuttuğumda seninle aynı hata mesajıyla karşılaştım
Le Ngoc Thuong

Bu kesinlikle ilerlememi sağladı. Şimdi bir sonraki adımda şaşırıp: Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES). Bu yeni hatayı inceleyeceğim ve bir cevap bulamazsam yeni bir soru gönderirim. Teşekkür ederim!
apalomer

Yanıtlar:


4

Bu hatayı Clang + MSVC davası için çoğaltabildim . Visual Studio'ya özel derleyiciyi Visual Studio dışından (yani komut satırı) kullanmaya çalıştığımızdan, derleyiciyi kullanmadan önce komut satırımızda VS derleme ortamını başlatmak gerekir . VCVarsXX.batDosyalar Bunu gerçekleştirmek; VS Komut İstemi araçlarının bir parçasıdır. Bu yüzden mimarinizi ( x86, x64vb.) Seçip komut dosyasını çalıştırarak CMake'in basit test programını oluşturmasına clang-clve devam etmesine izin vermelidir . VS 2019 için bulunduğu yer:

>"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 konusunu genişletmek için, kişisel find_package(OpenMP REQUIRED)olarak oldukça meyvesiz olduğunu gördüm . Belirttiğiniz gibi, bu CMake hatasını da aldım:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

Bu sitede birkaç öneri var (örneğin burada ve burada ) tüm değişkenleri manuel olarakFindOpenMP.cmake kütüphaneleri başarılı bir şekilde bulmasına izin verdiğini iddia . Bunu örnek CMake dosyanızla, biraz başarılı bir şekilde denedim:

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)

Bu, ikinci CMake yapılandırma girişimindeki kütüphaneleri "bulmayı" başardı (birincisi her zaman öncekiyle aynı Could NOT find OpenMP_CXXhatayı verdi ):

>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

Ancak , CMake OpenMP değişkenlerinin hiçbiri (özellikleOpenMP_CXX_LIBRARIES ) gerçekte kitaplık konumuna işaret . CKağıt yılların eksiklikler FindOpenMP.cmakeCKağıt sorunu sitesinde gündeme gelmiş burada ve ilgili LLVM / Clang ucunda sınırlamalar yanı olduğu görülmektedir.


Ne olursa olsun, örnek çalışma elde etmenin en temiz yolu find_package()tamamen hendek etmektir . Aşağıdakiler yapı sistemini başarıyla oluşturmamı ve yürütülebilir dosyayı derlemem ve çalıştırmamı sağladı:

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, bu hatayı çözen bir destek içerir. Hatalar giderilmiştir bu taahhüt.
apalomer

@apalomer Teşekkürler! Daha basit bir çözüm biliyorsanız, lütfen bir tane gönderin!
squareskittles

Koşmak vcvarsall.batbenim için clang-cl'yi PATH'e koymaz. Neden olduğu hakkında bir fikrin var mı?
Alex Reinking

@AlexReinking clang-cl kurulu mu? Kurulumunuzu ve bu bileşenleri nasıl kurduğunuzu bilmeden bilmek zordur . Gerekirse başka bir soru sormanızı öneririm!
squareskittles

Evet, VS2019 yükleyicisi üzerinden kuruldu
Alex Reinking
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.