Mam mały projekt testowy , który używa OpenMP do równoległości. Moim celem jest skompilowanie go w taki sposób, aby tworzył .dll
i .lib
dla bibliotek (ponieważ mój prawdziwy projekt łączy się z bibliotekami zewnętrznymi dystrybuowanymi przy użyciu tych typów), ze wsparciem dla OpenMP 4.5 lub nowszego i robię to z wiersza poleceń, aby można było to zrobić w oknie dokowanym dla testowanie i sprawdzanie (część dokera jest poza zakresem tego pytania, jest tylko dla odniesienia, dlaczego potrzebuję go do pracy z wiersza poleceń). Mogę skompilować ten projekt z różnymi kompilatorami, z którymi nie jestem zadowolony:
- MSVC:,
mkdir build-msvc
następniecmake ..
(z nowo utworzonego folderu) i na końcucmake --build . --config Release
. Kompiluje się dobrze, ale obsługuje tylko OpenMP 2.0, dlatego nie jest dobrą opcją dla mojego prawdziwego projektu. - Intel Parallel Studio:
mkdir build-intel
następniecmake .. -T "Intel C++ Compiler 19.0"
(z nowo utworzonego folderu) i na końcucmake --build . --config Release
. Obsługuje OpenMP 5.0, ale jego licencje są dla mnie dość drogie. - MinGW x64 g ++:,
mkdir build-g++
następniecmake .. -G "MinGW Makefiles"
(z nowo utworzonego folderu) i na konieccmake --build .
. Obsługuje OpenMP 4.5, ale ten kompilator nie jest kompatybilny z.lib
(o ile wiem), o którym wspomniałem, że jest dla mnie konieczny.
Próbowałem bez powodzenia użyć clang:
- CLANG z MSVC:,
mkdir build-clang-msvc
a następniecmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(z nowo utworzonego folderu), ale kończy się niepowodzeniem z następującym błędem:
- Identyfikator kompilatora CXX to Clang 8.0.1 z wierszem poleceń podobnym do MSVC - Sprawdź działanie kompilatora CXX: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - Sprawdź działanie kompilatora CXX: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - uszkodzony CMake Błąd w C: / Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (komunikat): Kompilator C ++ „C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe” nie jest w stanie skompilować prostego programu testowego. Nie działa z następującymi danymi wyjściowymi: Zmień katalog: C: / Users / [NAZWA UŻYTKOWNIKA] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp Uruchom komendę kompilacji: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Budowanie obiektu CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj [2/2] Łączenie pliku wykonywalnego CXX cmTC_bd131.exe FAILED: 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 - manifestuje - 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 / machine: X86 / debug / INCREMENTAL / subsystem: console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg .lib advapi32.lib && cd. ” RC Pass 1: polecenie „rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc” nie powiodło się (kod wyjścia 0) z następującymi danymi wyjściowymi: System nie może odnaleźć określonego pliku ninja: build zatrzymany: komenda nie powiodła się. CMake nie będzie w stanie poprawnie wygenerować tego projektu. Stos połączeń (najpierw ostatnie połączenie): CMakeLists.txt: 2 (projekt) - Konfiguracja niekompletna, wystąpiły błędy! Zobacz także „C: / Users / [NAZWA UŻYTKOWNIKA] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log”. Zobacz także „C: / Users / [NAZWA UŻYTKOWNIKA] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log”.
- Clang i Ninja oprócz MSVC:,
mkdir build-clang-ninja
a następniecmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(z nowo utworzonego folderu i zmianyPATH
zmiennej środowiskowej, aby najpierw nie znaleziono msvc), ale błąd kończy się następująco:
- Identyfikator kompilatora CXX to Clang 9.0.0 z wierszem poleceń podobnym do MSVC - Sprawdź działanie kompilatora CXX: C: / Program Files / LLVM / bin / clang-cl.exe - Sprawdź działanie kompilatora CXX: C: / Program Files / LLVM / bin / clang-cl.exe - uszkodzony CMake Błąd w C: / Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (komunikat): Kompilator C ++ „C: / Program Files / LLVM / bin / clang-cl.exe” nie jest w stanie skompilować prostego programu testowego. Nie działa z następującymi danymi wyjściowymi: Zmień katalog: C: / Users / [NAZWA UŻYTKOWNIKA] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp Uruchom komendę kompilacji: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Budowanie obiektu CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj [2/2] Łączenie pliku wykonywalnego CXX cmTC_50b73.exe FAILED: 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 - manifesty - 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 / machine: x64 / debugowanie podsystem: konsola kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. ” RC Pass 1: komenda „rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc” nie powiodła się (kod wyjścia 0) z następującymi danymi wyjściowymi: System nie może odnaleźć określonego pliku ninja: build zatrzymany: komenda nie powiodła się. CMake nie będzie w stanie poprawnie wygenerować tego projektu. Stos połączeń (najpierw ostatnie połączenie): CMakeLists.txt: 2 (projekt) - Konfiguracja niekompletna, wystąpiły błędy! Zobacz także „C: / Users / [NAZWA UŻYTKOWNIKA] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log”. Zobacz także „C: / Users / [NAZWA UŻYTKOWNIKA] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log”.
Wszelkie pomysły na kontynuowanie klangu? Myślę, że to moja najlepsza opcja na to, co chcę osiągnąć (skompiluj mój program testowy z obsługą OpenMP 4.5 lub nowszą wersją i produkcją .lib
i .dll
).
Powiązane posty / strony internetowe, które sprawdziłem, ale nie były przydatne do rozwiązania tego:
- Budowanie projektu c ++ w systemie Windows za pomocą CMake, Clang i Ninja
- Budowanie z CMake, Ninja i Clang w systemie Windows
- Sposoby kompilacji z Clangiem w systemie Windows , w szczególności ustawienie konsolidatora:
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- CMake build dla Windows (clang-cl) przy użyciu Generatora Ninja
- Instrukcja obsługi Clang-cl
Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
. Zagłębię się w ten nowy błąd i jeśli nie znajdę odpowiedzi, opublikuję nowe pytanie. Dziękuję Ci!Odpowiedzi:
Udało mi się zduplikować ten błąd w przypadku Clang + MSVC . Ponieważ próbujemy użyć kompilatora dostosowanego do Visual-Studio spoza Visual Studio (tj. Wiersza poleceń), konieczne jest zainicjowanie środowiska kompilacji VS w naszym wierszu poleceń przed użyciem kompilatora. Te
VCVarsXX.bat
pliki to osiągnąć; są częścią narzędzi VS Command Prompt. Tak więc, wybierając swoją architekturę (x86
,x64
itp) i uruchomienie skryptu, powinno to pozwolić CMake zbudować prosty program testowy zclang-cl
i kontynuować. Oto, gdzie się znajduje dla VS 2019:Aby rozwinąć kwestię OpenMP, osobiście uznałem, że jestem
find_package(OpenMP REQUIRED)
dość bezowocny. Jak wspomniałeś, otrzymałem również błąd CMake:Istnieje kilka sugestii na tej stronie (na przykład tutaj i tutaj ), które twierdzą, że ręczne wypełnienie wszystkich zmiennych pozwala
FindOpenMP.cmake
z powodzeniem znaleźć biblioteki. Próbowałem tego z twoim przykładowym plikiem CMake, z pewnym powodzeniem:Udało się to „znaleźć” biblioteki przy drugiej próbie konfiguracji CMake (pierwsza zawsze dawała taki sam
Could NOT find OpenMP_CXX
błąd jak poprzednio):Jednak nie udało się zbudować pliku wykonywalnego, ponieważ żadna ze zmiennych CMake OpenMP (szczególnie
OpenMP_CXX_LIBRARIES
) nie wskazuje lokalizacji biblioteki. Braki CUpewnij rokuFindOpenMP.cmake
zostały podniesione na stronie emisyjnej CMake tutaj , i nie wydają się być odpowiednie ograniczenia na koniec LLVM / Clang także.Niezależnie od tego, najczystszym sposobem, w jaki udało mi się uruchomić przykład, było
find_package()
całkowite porzucenie. Poniższe pozwoliło mi pomyślnie wygenerować system kompilacji oraz skompilować i uruchomić plik wykonywalny:źródło
vcvarsall.bat
nie stawia clang-cl w ŚCIEŻCE. Masz pomysł, dlaczego?