Sehr geehrte Kollegen, C ++ - Programmierer,
Nachdem ich die Visual Studio Toolchain für eine Weile auf Windows verwendet habe, habe ich beschlossen, Clang 5 eine Chance zu geben.
Ich habe die LLVM 5.0.0 Binaries, die Ninja Build-Umgebung, die VS 2017 Tools und CMake 3.9.3 installiert. Das letzte Ziel ist es, C- und C ++ - Anwendungen für Windows mit VS-Code mit der CMake-Integration als "IDE" und Clang mit LLD als Compiler und Linker kompilieren zu können.
Die Kompilierung und Ausführung eines einfachen Programms funktionierte einwandfrei ( Screenshot des jeweiligen Terminalverlaufs ). Clang hat automatisch die Standardbibliothek für Windows in den VS Tools-Verzeichnissen erkannt und eine ausführbare Ausgabe erstellt.
Der nächste Schritt war das Erstellen eines einfachen Builds mit Ninja ( Screenshot der Datei ninja.build und des Terminalverlaufs ) ). Der Build-Prozess funktionierte wie erwartet und erzeugte eine funktionierende ausführbare Datei, genau wie zuvor.
Die Probleme begannen, als ich anfing CMake in den Prozess zu integrieren. Meine Erwartung ist, dass CMake eine Ninja-Build-Datei erstellt und sie ausführt, richtig? Ich habe die folgende CMakeLists-Datei
ausprobiert %Vor% und aufgerufen CMake mit cmake -G Ninja
.
Die resultierende Ausgabe war enttäuschend und ich verstehe nicht genug, um das Problem selbst zu lösen bzw. zu lösen.
Ich nehme an, dass das Problem damit zusammenhängt, dass CMake calling mit VS-Style-Optionen aufruft, die einen Schrägstrich anstelle eines Minuszeichens verwenden, wie es der Clam erfordert.
Danke, dass ihr mir geholfen habt, Leute, ich weiß es zu schätzen: -)
Bitte hinterlassen Sie mir einen Kommentar, wenn Sie weitere Informationen benötigen.
Antwort auf Florians Beitrag
Ich habe versucht Florians Befehl, aber den Weg zu Ninja für eine kürzere Schreibweise weggelassen und es erwies sich als gut funktionieren.
%Vor%CMake hat eine Ninja-Build-Datei erstellt.
Ich habe ninja all
ausgeführt, um die ausführbare Datei als Test
zu erstellen. Ich habe ihn in Test.exe
umbenannt und das Programm wurde glücklich ausgeführt. Bis jetzt ... Erfolg !!! Aber viel komplizierter als ich erwartet hatte.
Ich habe endlich einen Weg gefunden, meine bevorzugten Werkzeuge so einzusetzen, wie es mir gefällt. Es ist nicht perfekt, aber es funktioniert besser als Florians Ansatz mit dem Systemnamen auf Generic (was ich schon seit einiger Zeit verwende)
Ich habe zuerst VS-Code eingerichtet, um das VS-Entwicklerterminal als Standardterminal zu verwenden. Ich habe dies getan, indem ich die folgende Zeile zu den VS-Code-Einstellungen hinzugefügt habe
"terminal.integrated.shell.windows": "C:\MeineProgramme\Visual_Studio\2017\BuildTools\Common7\Tools\LaunchDevCmd.bat"
Nachdem ich das Terminal innerhalb von VS Code gestartet habe, muss ich die entsprechende Batch-Datei aufrufen, die die benötigten Umgebungsvariablen setzt (in meinem Fall vcvars64.bat
). Diese finden Sie in
C:\MeineProgramme\Visual_Studio17\BuildTools\VC\Auxiliary\Build
Nachdem ich zu meinem Build-Verzeichnis navigiert habe, starte ich CMake mit den folgenden Optionen
cmake .. -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang-cl.exe" -DCMAKE_LINKER:PATH="C:\MeineProgramme\LLVM\bin\lld-link.exe"
Dies ermutigt CMake, alle meine installierten LLVM-Tools zu verwenden. Nicht nur clang
und lld
(stellen Sie sicher, lld-link zu verwenden, das die Optionen unterstützt, die von /
angeführt werden), sondern auch llvm-ar
und llvm-ranlib
. Das einzige MS Build Tool ist der Resource Compiler, den ich momentan nicht benutze.
Bisher Erfolg, denke ich.
Zögern Sie nicht, mich zu kontaktieren oder kommentieren Sie unten, wenn Sie weitere Fragen haben.
Inspiriert von den "Möglichkeiten zum Kompilieren mit Clang unter Windows" > Blogpost von @Unspongeful und nach einigen ausführlichen Tests funktionierte die folgende Befehlszeile für mich (und ja, es ist ein großer Befehl, den ich zur besseren Lesbarkeit einfach in mehrere Zeilen aufgeteilt habe):
%Vor%Hier einige Hintergrundinformationen:
Ich habe Ihre Linker-Flags mit der Umgebungsvariablen LDFLAGS
Ich habe die Umgebungsvariable PATH
so reduziert, dass sie nur auf ninja
zeigt, weil CMake meine MinGW
toolchain ausgewählt hat (die ich nicht in den Build-Prozess aufnehmen wollte)
Bezogen auf Umwelt Variable, die von CMake verwendet wird, um Visual C ++ - Compiler-Tools für Ninja zu erkennen
Das Definieren der Compiler-IDs "umgeht die Prüfung auf funktionierende Compiler- und grundlegende Compiler-Informationstests"
Siehe obsolet, aber manchmal nützlich CMakeForceCompiler
Modul
Und ich habe CMAKE_SYSTEM_NAME
auf Generic
gesetzt, um zusätzliche plattformspezifische Probleme zu vermeiden Compiler / Linker-Flags, die von CMake hinzugefügt wurden
Siehe Wie man den benutzerdefinierten cmake C / C ++ - Compiler teilweise deaktiviert Überprüfen
Im Moment scheint es, als müssten Sie viele automatische Checks von CMake umgehen, damit es funktioniert. Informieren Sie sich wahrscheinlich beim CMake-Team oder melden Sie ein Problem , um dieses Szenario offiziell zu unterstützen.
Und der letzte Teil mit einem Generic
System ist wahrscheinlich nicht die beste Wahl, weil Windows spezifische Einstellungen wie das .exe
Suffix übersprungen werden.
Aber es war die einzige Konstellation, die tatsächlich funktionierte:
%Vor%Ich stieß auf ähnliche Probleme, wenn ich versuchte, clang cmake und msvc 2017 zusammen zu verwenden. Zumindest für ein sehr einfaches Testprojekt war ich in der Lage, alles in Gang zu bringen, aber ich bin ziemlich neu in diesem Bereich, also wird meine Lösung vielleicht nicht Ihre Probleme lösen.
Wie auch immer. Soweit ich weiß, sollten Sie clang-cl.exe
anstatt clang.exe
mit VS verwenden. Jedoch ist das Erstellen in x86-Konfigurationen immer noch fehlgeschlagen, da einige Linker-Probleme bezüglich x86- und x64-Bibliothek-Inkompatibilitäten aufgetreten sind.
Also hier ist meine Lösung, um beide, x64 und x86-Konfigurationen, in VS 2017 zu bauen.
CMakeLists.txt
und öffnen Sie diesen in VS über den Dialog Open Folder
. CMake
Change CMake Settings > CMakeLists.txt
. Dies erzeugt ein CMakeSettings.json
mit Einstellungen für alle Build-Konfigurationen. Geben Sie die Pfade der x64 / x86-cmake-Compiler in cmakeCommandArgs
für alle Konfigurationen an. Meins sieht so aus:
}
Nun sollten Sie in der Lage sein, sowohl x64- als auch x86-Konfigurationen ohne Fehler zu erstellen.