c++ - So kompilieren Sie Clang unter Windows




llvm windows (3)

Das ist, was in meiner Umgebung unter Windows 8.1 funktionierte , insgesamt ähnlich wie Seths Anweisung, jedoch mit frischeren Werkzeugen.

  1. Ich habe MinGW 64 in C:/MinGW installiert, um genau zu sein, ich habe STLs Distro verwendet .
  2. Ich habe Python 3 installiert, nur die neueste Version genommen.
  3. Ich habe CMake 3.0.2 installiert
  4. Ich habe LLVM und Clang auf Github gegabelt und auf meinen Rechner geklont, Clang's Repo in den Ordner llvm \ tools \ clang gestellt (die Struktur ist auf der offiziellen Seite beschrieben , sie zeigt nur Beispiele mit svn anstelle von git).
  5. Ich habe den "build" -Ordner neben dem "llvm" -Ordner erstellt und im "build" cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm diesen Befehl ausgeführt: cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm (aus irgendeinem Grund konnte CMake das "make" nicht automatisch finden)
  6. Dann lief ich "make" um tatsächlich zu bauen. Der Bau dauerte ein paar Stunden.
  7. Danach habe ich in einem anderen Ordner 1.cpp erstellt, der einen Lambda-Ausdruck ausführt, um "hi" zu drucken:
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
  1. Ich habe auch eine cmd-Datei erstellt, um die cpp zu kompilieren. Alternativ können Sie die PATH-Variable einfach auf andere Weise richtig einstellen. Beachten Sie, dass die GCC-Version in Ihrem MinGW-Paket möglicherweise anders ist. Auch Clang hat einige eingebaute Pfade, die versucht werden, aber sie sind an bestimmte GCC-Versionen gebunden, und meine gehörte nicht dazu. Daher musste ich die Include-Pfade explizit angeben.
set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH% 
clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include"
-I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include"
  1. Beim Ausführen dieser Cmd-Datei wurde 1.cpp in 1.exe kompiliert, die "hi" druckte.

Was hat nicht funktioniert :

  1. Ich habe versucht, die gleichen llvm + clang-Quellen ohne MinGW + GCC unter Verwendung des MSVC-Compilers von VS 2015 CTP zu erstellen. Es hat Clang erfolgreich erstellt. Der einzige Unterschied besteht darin, dass Sie dies vom Developer CMD-Fenster aus tun müssen, und Sie müssen cmake -G "Visual Studio 12" ..\llvm und dann die Lösung in Visual Studio kompilieren. Dieser Clang konnte jedoch kein Beispiel-CPP kompilieren. Er beschwerte sich über "nicht deklarierte Kennung 'char16_t'" und "__int128 wird auf diesem Ziel nicht unterstützt" innerhalb der MinGW-Standardbibliothekkopfzeilen. Wenn ich clang-cl- und MS STL-Header verwende, klagt es über "throw x (y)" -Kennzeichner. Vielleicht musste ich ein paar zusätzliche Schlüssel für den Build bereitstellen, aber ich konnte es nicht zum Laufen bringen.

C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xiosbase (293,4): Fehler: Der Wurfausdruck kann noch nicht kompiliert werden _THROW_NCEE (Fehler "ios_base :: eofbit set"); C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xstddef (56,30): Hinweis: Erweitert aus dem Makro '_THROW_NCEE' #define _THROW_NCEE (x, y) wirft x (y)

Ich habe versucht, einen Weg zu finden, Clang zum Laufen zu bringen, habe aber Probleme. Ich bekomme Clang zum erfolgreichen Kompilieren, aber wenn ich versuche, ein Programm zu kompilieren, habe ich eine Reihe von Fehlern in den Standard-Headern.

Ich kenne die hervorragenden vorgefertigten Versionen von Rubenvb , aber ich möchte es für mich kompilieren. Ich hörte auch die GoingNative-Gespräche über Clang, die besagten, dass es noch keine sehr gute Windows-Unterstützung gab. Wie kann ich unter Windows arbeiten?


Ich habe die folgende Methode zum Kompilieren von clang für C ++ unter Windows 7 verwendet und wurde von Mysticial und anderen überprüft:

  1. Laden Sie MinGW herunter und installieren Sie es (stellen Sie sicher, dass Sie den C ++ - Compiler installieren), und legen Sie den Ordner bin in Ihren PFAD (ich habe MinGW 4.6.1 und habe erfolgreich auf einem anderen Computer mit 4.6.2 getestet).
  2. Stellen Sie sicher, dass Sie Python in Ihrem PFAD haben ( nicht 3 , ich habe 2,7).
  3. (Optional: Stellen Sie sicher, dass sich in Ihrem PFAD Perl befindet (ich habe ActivePerl 5.14.2 64-Bit verwendet).
  4. Holen Sie sich CMake und legen Sie es in Ihren PFAD
  5. Gehen Sie zur LLVM-Downloadseite und laden Sie den LLVM 3.0-Quellcode zusammen mit dem Clang-Quellcode herunter. Holen Sie sich den Code nicht aus dem SVN, er funktioniert nicht mit den MinGW-Headern.
  6. Extrahieren Sie die Quellcodes. Ich hatte die llvm-Quelle in einem Ordner namens llvm-3.0.src auf meinem Desktop
  7. Legen Sie die Clang-Quelle direkt in einem Ordner mit dem Namen "Clang" ab (dies muss genau so heißen, sonst werden Sie llvm erstellen, aber Clang wird nicht erstellt) im "tools" -Ordner im llvm-Quellordner. Dadurch sollten Ihre Verzeichnisse aussehen mögen:
    • llvm quelle
      • Autoconf-Ordner
      • ...
      • Werkzeugordner
        • ...
        • Clang-Ordner
          • Bindungsordner
          • ...
          • Makefile-Datei
          • ...
        • ...
      • ...
  8. Erstellen Sie einen Ordner mit dem Namen "build" im selben Verzeichnis wie der llvm-Quellordner
  9. Öffnen Sie eine Befehlszeile und cd im Build-Ordner
  10. Führen Sie den Befehl cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

    • (Das letzte Argument ist der relative Pfad zu dem Ordner, in dem sich die llvm-Quelle befindet (und der clang-Quelle im tools / clang-Unterverzeichnis).)

    • Dies entspricht einem Befehl "configure", und die Makefiles und alles werden im Build-Ordner generiert

    • Das wird ein paar Minuten dauern
  11. Führen Sie den Befehl mingw32-make

    • Dadurch werden llvm und clang kompiliert, und die ausführbaren Dateien für clang werden im Ordner build / bin generiert
    • Dies wird wahrscheinlich lange dauern. (Sie können versuchen, den Vorgang zu beschleunigen, indem Sie parallele Builds hinzufügen, die Option -j<number> ) Es kann sinnvoll sein, alle anderen Programme zu schließen, damit sich Ihr Computer konzentrieren kann und der langwierige Kompilierungsprozess, z als Sperren eines Ordners, in den der Compiler schreibt (es ist mir passiert). Ich habe sogar meine Antiviren- und Firewall-Software deaktiviert, damit sie nicht versuchen, die erzeugten Dateien zu scannen und im Weg zu stehen.

Zeit zum Ausprobieren

  1. Erstellen Sie eine .cpp-Datei im Ordner build / bin (ich verwende hello.cpp). Verwenden Sie einen Standard-Bibliotheksheader, um sicherzustellen, dass die Include-Pfade und -Bibliotheken funktionieren. Beginnen Sie mit einem sehr einfachen Programm.

    (Was ich angefangen habe mit:

    #include <iostream>
    
    int main() {
        std::cout << "hi";
    }

    )

  2. Führen Sie den Befehl clang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt

    (-L gibt ein Verzeichnis an, in dem nach Bibliotheken gesucht werden soll, und -l gibt eine zu verknüpfende Bibliothek an.) (Wenn MinGW nicht im selben Pfad wie ich installiert ist, können Sie die Pfade mit dem Befehl "g ++ somefile" ermitteln. cpp -v ", um g ++ zu veranlassen, sich mit den verfügbaren Optionen für die Bibliothekspfade und Bibliotheksdateien und alles andere zu beschäftigen. Suchen Sie am Ende der Ausgabe nach den Optionen -L und -l. Beachten Sie die .o-Datei Namen, die mit den -Ls durchsetzt sind. Clang verwendet viele der gleichen Optionen wie g ++, also habe ich diese Zeile buchstäblich aus der Ausgabe von g ++ kopiert und eingefügt.

    Dies sollte Ihr Programm kompilieren und eine Datei mit dem Namen a.out erzeugen

  3. benennen Sie a.out in a.exe oder was auch immer

  4. Führen Sie die .exe aus
  5. Ihr Programm sollte laufen.

Clang (3.0) hat noch einige Probleme unter Windows (ich weiß nicht, ob diese Probleme auch unter Linux vorliegen). Wenn Sie beispielsweise ein Lambda (das Clang nicht unterstützt) mit -std = c ++ 0x kompilieren, stürzt Clang ab und gibt einen Diagnosefehler aus. (Ich wurde im LLVM-IRC darüber informiert, dass Clang Parsing für Lambdas implementiert, jedoch keine semantische Analyse. Dies ist die Phase, in der er abstürzt (weil er vergessen hat, das Parsing von Lambdas für das 3.0-Release zu deaktivieren). Das wissen sie bereits Fehler)

Auch der berühmte Mysticial stimmte zu, diesen Leitfaden zu testen und machte während des Tests einige Bemerkungen:

  1. Windows-Header scheinen zu funktionieren.
  2. Funktioniert derzeit nur für 32-Bit.
  3. 64-Bit kompiliert gut, wird aber nicht zusammengebaut.
  4. SSE ist wahrscheinlich in Ordnung. ([Mysticial] hat jedoch keine funktionierende SSE auf 32-Bit getestet.)

Siehe http://clang.llvm.org/get_started.html#buildWindows

Ich habe "Visual Studio 11 Win64" mit cmake verwendet und es funktioniert mit dem derzeit verfügbaren VS Express für Desktop.

Auch für lib verwende ich MinGW-W 64 und für fehlende Dateien SUA. http://mingw-w64.sourceforge.net/ und http://www.suacommunity.com/

Zum Verknüpfen von .o-Dateien, die von clang ++ für die Verwendung mit den W 64- Binärdateien erstellt wurden, verwende ich -m i386pep mit dem ld-Linker, der erneut im Lieferumfang von W 64 enthalten ist .





clang