Ich habe ein kleines Testprojekt , das OpenMP für Parallelisierung verwendet. Mein Ziel ist es, es so zu kompilieren, dass es produziert .dll
und .lib
für Bibliotheken (da mein reales Projekt Links zu externen Bibliotheken enthält, die mit diesen Typen verteilt werden), mit Unterstützung für OpenMP 4.5 oder neuer, und dies über die Befehlszeile zu tun, damit es auf einem Docker für ausgeführt werden kann Testen und Überprüfen (der Docker-Teil fällt nicht in den Geltungsbereich dieser Frage, er dient nur als Referenz dafür, warum ich ihn für die Arbeit über die Befehlszeile benötige). Ich kann dieses Projekt mit verschiedenen Compilern kompilieren, mit denen ich nicht zufrieden bin:
- MSVC:
mkdir build-msvc
danncmake ..
(aus dem neu erstellten Ordner) und schließlichcmake --build . --config Release
. Dies lässt sich gut kompilieren, unterstützt jedoch nur OpenMP 2.0 und ist daher keine gute Option für mein reales Projekt. - Intel Parallel Studio:
mkdir build-intel
danncmake .. -T "Intel C++ Compiler 19.0"
(aus dem neu erstellten Ordner) und schließlichcmake --build . --config Release
. Dies unterstützt OpenMP 5.0, aber seine Lizenzen sind für mich ziemlich teuer. - MinGW x64 g ++ :
mkdir build-g++
, danncmake .. -G "MinGW Makefiles"
(aus dem neu erstellten Ordner) und schließlichcmake --build .
. Es unterstützt OpenMP 4.5, aber dieser Compiler ist nicht kompatibel mit.lib
(soweit ich weiß), was ich bereits erwähnt habe, ist für mich notwendig.
Ich habe erfolglos versucht, clang zu verwenden:
- CLANG von MSVC :
mkdir build-clang-msvc
, danncmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(aus dem neu erstellten Ordner), aber es schlägt mit dem folgenden Fehler fehl:
- Die CXX-Compiler-Identifikation lautet Clang 8.0.1 mit MSVC-ähnlicher Befehlszeile - Überprüfen Sie, ob der CXX-Compiler funktioniert: C: / Programme (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - Überprüfen Sie, ob der CXX-Compiler funktioniert: C: / Programme (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - defekt CMake-Fehler bei C: / Programme / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (Nachricht): Der C ++ - Compiler "C: / Programme (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe" kann kein einfaches Testprogramm kompilieren. Es schlägt mit der folgenden Ausgabe fehl: Ändern Sie Dir: C: / Users / [BENUTZERNAME] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp Führen Sie die Build-Befehle aus: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Erstellen des CXX-Objekts CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj [2/2] Verknüpfen der ausführbaren CXX-Datei cmTC_bd131.exe FEHLGESCHLAGEN: cmTC_bd131.exe cmd.exe / C "cd. &&" C: \ Programme \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - Manifeste - 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: Konsolenkernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comd .lib advapi32.lib && cd. " RC Pass 1: Befehl "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" fehlgeschlagen (Exit-Code 0) mit der folgenden Ausgabe: Die angegebene Datei wurde vom System nicht gefunden ninja: build gestoppt: Unterbefehl fehlgeschlagen. CMake kann dieses Projekt nicht korrekt generieren. Call Stack (letzter Anruf zuerst): CMakeLists.txt: 2 (Projekt) - Bei unvollständiger Konfiguration sind Fehler aufgetreten! Siehe auch "C: / Users / [USER NAME] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log". Siehe auch "C: / Users / [USER NAME] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
- Clang und Ninja abgesehen von MSVC :
mkdir build-clang-ninja
, danncmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(aus dem neu erstellten Ordner und Ändern derPATH
Umgebungsvariablen, sodass die Nicht-MSVC zuerst gefunden werden), aber es schlägt mit dem folgenden Fehler fehl:
- Die CXX-Compiler-Identifikation lautet Clang 9.0.0 mit MSVC-ähnlicher Befehlszeile - Überprüfen Sie, ob der CXX-Compiler funktioniert: C: / Programme / LLVM / bin / clang-cl.exe - Überprüfen Sie, ob der CXX-Compiler funktioniert: C: / Programme / LLVM / bin / clang-cl.exe - defekt CMake-Fehler bei C: / Programme / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (Nachricht): Der C ++ - Compiler "C: / Programme / LLVM / bin / clang-cl.exe" kann kein einfaches Testprogramm kompilieren. Es schlägt mit der folgenden Ausgabe fehl: Ändern Sie Dir: C: / Users / [BENUTZERNAME] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp Führen Sie die Build-Befehle aus: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Erstellen des CXX-Objekts CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj [2/2] Verknüpfen der ausführbaren CXX-Datei cmTC_50b73.exe FEHLGESCHLAGEN: cmTC_50b73.exe cmd.exe / C "cd. &&" C: \ Programme \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - Manifeste - 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. / deb / /: Subsystem: Konsole kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. " RC Pass 1: Befehl "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" fehlgeschlagen (Exit-Code 0) mit der folgenden Ausgabe: Die angegebene Datei wurde vom System nicht gefunden ninja: build gestoppt: Unterbefehl fehlgeschlagen. CMake kann dieses Projekt nicht korrekt generieren. Call Stack (letzter Anruf zuerst): CMakeLists.txt: 2 (Projekt) - Bei unvollständiger Konfiguration sind Fehler aufgetreten! Siehe auch "C: / Users / [USER NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log". Siehe auch "C: / Users / [USER NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".
Irgendwelche Ideen, wie man mit dem Klirren umgeht? Ich denke, es ist meine beste Option für das, was ich erreichen möchte (kompiliere mein Testprogramm mit Unterstützung für OpenMP 4.5 oder neuer und produziere .lib
und .dll
).
Verwandte Beiträge / Webseiten, die ich überprüft habe, aber zur Lösung dieses Problems nicht hilfreich waren:
- Erstellen eines C ++ - Projekts unter Windows mit CMake, Clang und Ninja
- Bauen mit CMake, Ninja und Clang unter Windows
- Möglichkeiten zum Kompilieren mit Clang unter Windows , insbesondere Festlegen des Linkers:
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- CMake-Erstellung für Windows (clang-cl) mit Ninja Generator
- Clang-cl Benutzerhandbuch
Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
. Ich werde mich mit diesem neuen Fehler befassen und wenn ich keine Antwort finde, werde ich eine neue Frage stellen. Vielen Dank!Antworten:
Ich konnte diesen Fehler für den Fall Clang + MSVC duplizieren . Da wir versuchen, den auf Visual-Studio zugeschnittenen Compiler von außerhalb von Visual Studio (dh der Befehlszeile) zu verwenden, muss die VS-Buildumgebung in unserer Befehlszeile initialisiert werden , bevor der Compiler verwendet wird. Die
VCVarsXX.bat
Dateien erreichen dies; Sie sind Teil der VS-Eingabeaufforderungstools. So durch Ihre Architektur Kommissionierung (x86
,x64
usw.) und das Skript ausgeführt wird , sollte dies ermöglichen CMake die einfache Testprogramm mit aufzubauenclang-cl
und fortzufahren. Hier befindet es sich für VS 2019:Um das OpenMP-Problem zu erweitern, fand ich
find_package(OpenMP REQUIRED)
es ziemlich fruchtlos, es zu verwenden. Wie Sie erwähnt haben, habe ich auch diesen CMake-Fehler erhalten:Auf dieser Site gibt es einige Vorschläge (zum Beispiel hier und hier ), die besagen, dass das manuelle Auffüllen aller Variablen
FindOpenMP.cmake
das erfolgreiche Auffinden der Bibliotheken ermöglicht. Ich habe dies mit Ihrer Beispiel-CMake-Datei mit einigem Erfolg versucht:Dies gelang es, die Bibliotheken beim zweiten CMake-Konfigurationsversuch zu "finden" (der erste ergab immer den gleichen
Could NOT find OpenMP_CXX
Fehler wie zuvor):Dies konnte jedoch die ausführbare Datei nicht erstellen, da keine der CMake OpenMP-Variablen (insbesondere
OpenMP_CXX_LIBRARIES
) tatsächlich auf den Speicherort der Bibliothek verweist. Die Mängel von CMakeFindOpenMP.cmake
wurden auf der CMake-Issue-Site hier angesprochen , und es scheint auch relevante Einschränkungen für das LLVM / Clang-Ende zu geben.Unabhängig davon war der sauberste Weg, das Beispiel zum Laufen zu bringen, den Graben
find_package()
insgesamt. Folgendes ermöglichte es mir, das Buildsystem erfolgreich zu generieren und die ausführbare Datei zu kompilieren und auszuführen:quelle
vcvarsall.bat
bringt für mich kein Klirren in den PFAD. Irgendeine Idee warum?