So kompilieren Sie Clang unter Windows

So kompilieren Sie Clang unter Windows


Ich habe versucht, einen Weg zu finden, Clang unter Windows zum Laufen zu bringen, aber ich habe Probleme. Ich bringe Clang dazu, erfolgreich zu kompilieren, aber wenn ich versuche, ein Programm zu kompilieren, habe ich eine Reihe von Fehlern in den Standard-Headern.


Ich kenne die ausgezeichneten vorgefertigten Clang-Versionen von rubenvb, aber ich möchte es selbst kompilieren. Ich habe mir auch die GoingNative-Gespräche über clang angehört, die besagten, dass es noch keine sehr gute Windows-Unterstützung habe. Wie kann ich Clang unter Windows zum Laufen bringen?


Antworten:


Ich habe die folgende Methode verwendet, um clang für C++ unter Windows 7 zu kompilieren, und sie wurde von Mystcial und anderen validiert:



  1. Laden Sie MinGW herunter und installieren Sie es (stellen Sie sicher, dass Sie den C++-Compiler installieren) und legen Sie den bin-Ordner in Ihrem PATH ab (ich habe MinGW 4.6.1 und erfolgreich auf einem anderen Computer mit 4.6.2 getestet)

  2. Stellen Sie sicher, dass Sie Python in Ihrem PATH haben (nicht 3 , ich habe 2.7)

  3. (Optional:Stellen Sie sicher, dass Sie Perl in Ihrem PATH haben (ich habe ActivePerl 5.14.2 64-Bit verwendet))

  4. Holen Sie sich CMake und fügen Sie es in Ihren PATH ein

  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 einen Ordner namens "clang" (er muss genau so heißen, sonst bauen Sie llvm, aber clang wird nicht gebaut) im Ordner "tools" im llvm-Quellordner, das sollte funktionieren Ihre Verzeichnisse sehen so aus:

    • llvm-Quelle

      • autoconf-Ordner

      • ...

      • Tools-Ordner

        • ...

        • clang-Ordner

          • Bindungsordner

          • ...

          • Makefile-Datei

          • ...


        • ...


      • ...



  8. Erstellen Sie einen Ordner namens "build" im selben Verzeichnis wie der llvm-Quellordner

  9. Öffnen Sie eine Befehlszeile und cd in den Build-Ordner

  10. Führen Sie den Befehl cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src aus



    • (Das letzte Argument ist der relative Pfad zu dem Ordner, der die llvm-Quelle enthält (und die Clang-Quelle im Unterverzeichnis tools/clang))


    • Dies entspricht einem "Konfigurieren"-Befehl, und die Makefiles und alles andere wird im Build-Ordner generiert


    • Dies dauert einige Minuten


  11. Führen Sie den Befehl mingw32-make aus



    • Dadurch werden llvm und clang kompiliert und die ausführbaren Clang-Dateien werden im build/bin-Ordner generiert

    • Dies wird wahrscheinlich lange dauern. (Sie können versuchen, es zu beschleunigen, indem Sie parallele Builds hinzufügen, -j<number> Option) Es könnte gut sein, alle anderen Programme zu schließen, damit sich Ihr Computer konzentrieren kann und sie den langwierigen Kompilierungsprozess nicht stören, z. B. das 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 generierten Dateien zu scannen und sich in die Quere kommen.



Zeit zum Testen



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


    (Womit ich angefangen habe:


    #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 aus


    (-L gibt ein Verzeichnis an, in dem nach Bibliotheken gesucht werden soll, und -l gibt eine zu verknüpfende Bibliothek an)
    (Wenn Sie MinGW nicht im selben Pfad wie ich installiert haben, können Sie die Pfade mit dem Befehl herausfinden "g++ somefile.cpp -v", um g++ dazu zu bringen, seine Eingeweide darüber auszuplaudern, welche Optionen es für die Bibliothekspfade und Bibliotheksdateien und alles andere verwendet
    Suchen Sie am Ende der Ausgabe nach den Optionen -L und -l . Achten Sie auf die .o-Dateinamen, die mit den -L's 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 namens a.out

    erzeugen

  3. Benennen Sie a.out in a.exe oder was auch immer um


  4. Führen Sie die .exe aus

  5. Ihr Programm sollte laufen.


Clang (3.0) hat immer noch einige Probleme unter Windows (ich weiß nicht, ob diese Probleme auch unter Linux auftreten). 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 dies daran liegt, dass clang implementiert das Parsen für Lambdas, aber keine semantische Analyse, das ist die Phase, in der es abstürzt (weil sie vergessen haben, das Parsen von Lambdas für die Version 3.0 zu deaktivieren), und sie kennen diesen Fehler bereits)


Außerdem hat der berühmte Mystiker freundlicherweise zugestimmt, diesen Leitfaden zu testen, und während seines Tests einige Beobachtungen gemacht:



  1. Windows-Header scheinen zu funktionieren.

  2. Funktioniert derzeit nur für 32-Bit.

  3. 64-Bit lässt sich gut kompilieren, wird aber nicht assembliert.

  4. SSE ist wahrscheinlich in Ordnung. ([Mystcial hat jedoch keine] funktionierende SSE auf 32-Bit getestet.)


Einige Code-Antworten


 $ cat t.c #include <stdio.h>
int main(int argc, char **argv) { printf("hello world\n");
} $ clang t.c $ ./a.out hello world
 $ cat ~/t.c typedef float V __attribute__((vector_size(16)));
V foo(V a, V b) { return a+b*a;
}
 $ clang ~/t.c -E # 1 "/Users/sabre/t.c" 1  typedef float V __attribute__((vector_size(16)));
V foo(V a, V b) { return a+b*a;
}
 $ clang -fsyntax-only ~/t.c 
 $ clang -fsyntax-only ~/t.c -pedantic /Users/sabre/t.c:2:17: warning: extension used typedef float V __attribute__((vector_size(16)));     ^ 1 diagnostic generated. 
 $ clang -cc1 ~/t.c -ast-print typedef float V __attribute__(( vector_size(16) ));
V foo(V a, V b) { return a + b * a;
}
 $ clang ~/t.c -S -emit-llvm -o - define <4 x float>
@foo(<4 x float>
%a, <4 x float>
%b) { entry:
%mul = mul <4 x float>
%b, %a
%add = add <4 x float>
%mul, %a
ret <4 x float>
%add } $ clang -fomit-frame-pointer -O3 -S -o - t.c # On x86_64 ... _foo: Leh_func_begin1: mulps %xmm0, %xmm1 addps %xmm1, %xmm0 ret Leh_func_end1: