51 votes

Comment compiler Clang sous Windows

J'ai essayé de trouver un moyen de faire fonctionner Clang sous Windows mais j'ai des difficultés. J'ai réussi à compiler Clang, mais lorsque j'essaie de compiler un programme, j'ai un tas d'erreurs dans les en-têtes standard.

Je suis conscient de les excellentes versions préconstruites de clang de rubenvb mais je veux le compiler pour moi-même. J'ai aussi écouté les discussions de GoingNative sur clang qui disait qu'il n'avait pas encore un très bon support pour Windows. Comment puis-je faire fonctionner clang sous Windows ?

57voto

Seth Carnegie Points 45196

J'ai utilisé la méthode suivante pour compiler clang pour C++ sur Windows 7 et elle a été validée par Mysticial et d'autres :

  1. Télécharger et installer MinGW (assurez-vous d'installer le compilateur C++) et mettez le dossier bin dans votre PATH (j'ai MinGW 4.6.1 et j'ai testé avec succès sur un autre ordinateur avec 4.6.2)
  2. Assurez-vous que vous avez Python dans votre PATH ( pas 3 j'ai 2.7)
  3. (Facultatif : Assurez-vous que vous avez Perl dans votre PATH (j'ai utilisé ActivePerl 5.14.2 64-bit))
  4. Obtenez CMake et mettez-le dans votre PATH
  5. Allez à la Page de téléchargement de LLVM et téléchargez le code source de LLVM 3.0 ainsi que le code source de Clang. Ne prenez pas le code du SVN, il ne fonctionne pas avec les en-têtes MinGW.
  6. Extraire les codes sources ; j'avais les sources de llvm dans un dossier nommé llvm-3.0.src sur mon bureau.
  7. Mettez les sources de clang directement dans un dossier appelé "clang" (il doit s'appeler exactement comme ça ou vous construirez llvm mais clang ne sera pas construit) dans le dossier "tools" à l'intérieur du dossier des sources de llvm, cela devrait donner les répertoires suivants :
    • source llvm
      • dossier autoconf
      • ...
      • dossier outils
        • ...
        • dossier clang
          • dossier des fixations
          • ...
          • Fichier Makefile
          • ...
        • ...
      • ...
  8. Créez un dossier nommé "build" dans le même répertoire que le dossier source de llvm.
  9. Ouvrez une ligne de commande et accédez au dossier de construction.
  10. Exécutez la commande cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

    • (le dernier argument est le chemin relatif vers le dossier qui contient les sources llvm (et les sources clang dans le sous-répertoire tools/clang)).

    • Cela équivaut à une commande "configure", et les fichiers makefiles et tout le reste seront générés dans le dossier de construction.

    • Cela prendra quelques minutes

  11. Exécutez la commande mingw32-make

    • Cela compilera llvm et clang, et les exécutables clang seront générés dans le dossier build/bin.
    • Cela prendra probablement beaucoup de temps. (Vous pouvez essayer de l'accélérer en ajoutant des constructions parallèles, -j<number> option) Il peut être bon de fermer tous les autres programmes afin que votre ordinateur puisse se concentrer et qu'ils n'interfèrent pas avec le long processus de compilation, par exemple en mettant un verrou sur un dossier dans lequel le compilateur écrit (cela m'est arrivé). J'ai même désactivé mon antivirus et mon pare-feu pour qu'ils n'essaient pas d'analyser les fichiers générés et ne se mettent pas en travers du chemin.

Il est temps de le tester

  1. Créer un fichier .cpp dans le dossier build/bin (je vais utiliser hello.cpp). Utilisez un en-tête de bibliothèque standard pour vous assurer que les chemins d'inclusion et les bibliothèques fonctionnent. Commencez par un programme très simple.

    (Ce avec quoi j'ai commencé :

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

    )

  2. Exécutez la commande 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 spécifie un répertoire dans lequel chercher les bibliothèques et -l spécifie une bibliothèque à lier) (Si MinGW n'est pas installé au même endroit que moi, vous pouvez trouver les chemins avec la commande "g++ somefile.cpp -v" pour que g++ vous dise quelles options il utilise pour les chemins des bibliothèques, les fichiers de bibliothèques et tout le reste. Cherchez vers la fin de la sortie les options -L et -l. Faites attention aux noms de fichiers .o qui sont intercalés avec les -L. Clang utilise beaucoup des mêmes options que g++, donc j'ai littéralement copié et collé cette ligne à partir de la sortie de g++.)

    Cela devrait compiler votre programme et produire un fichier nommé a.out.

  3. renommez a.out en a.exe ou autre.

  4. Exécutez le fichier .exe

  5. Votre programme devrait s'exécuter.

Clang (3.0) a encore quelques problèmes sous Windows (je ne sais pas si ces problèmes existent aussi sous linux). Par exemple, la compilation d'un lambda (que clang ne supporte pas) avec -std=c++0x fera planter clang et émettra une erreur de diagnostic. (On m'a informé sur l'IRC de LLVM que c'est parce que clang implémente l'analyse syntaxique pour les lambdas mais pas l'analyse sémantique, qui est la phase dans laquelle il plante (parce qu'ils ont oublié de désactiver l'analyse syntaxique des lambdas pour la version 3.0), et ils sont déjà au courant de ce bogue).

Par ailleurs, l'illustre Mysticial a gentiment accepté de tester ce guide et a fait quelques observations lors de son test :

  1. Les en-têtes Windows semblent fonctionner.
  2. Actuellement, il ne fonctionne que pour le 32 bits.
  3. Le 64 bits compile bien, mais ne s'assemble pas.
  4. L'ESS est probablement bien. ([Mysticial n'a pas] testé un SSE fonctionnel sur 32 bits cependant).

5voto

Max Galkin Points 10116

Voici ce qui a marché dans mon environnement, sur Windows 8.1, globalement similaire à l'instruction de Seth, mais avec des outils plus frais.

  1. J'ai installé MinGW 64 dans C:/MinGW pour être précis, j'ai utilisé La distro de STL .
  2. J'ai installé Python 3, j'ai pris leur dernière version.
  3. J'ai installé CMake 3.0.2
  4. J'ai bifurqué LLVM y Clang sur Github et je les ai clonés sur ma machine, en plaçant le dépôt de Clang dans llvm. \tools\clang (la structure est décrite sur la page officielle ils montrent juste des exemples avec svn au lieu de git).
  5. J'ai créé le dossier "build" à côté du dossier "llvm", et à l'intérieur du dossier "build" j'ai exécuté cette commande : cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm (pour une raison quelconque, CMake n'a pas pu trouver le "make" automatiquement)
  6. Puis j'ai lancé "make" pour construire. La construction a pris quelques heures.
  7. Après cela, dans un autre dossier, j'ai créé 1.cpp, qui exécute une expression lambda pour imprimer "hi" :
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
  1. J'ai également créé un fichier cmd pour compiler le cpp. Alternativement, vous pouvez simplement définir la variable PATH correctement par d'autres moyens. Notez que la vesrion GCC dans votre paquetage MinGW peut être différente. Clang a aussi des chemins intégrés qu'il essaie, mais ils sont liés à des versions spécifiques de GCC, et la mienne n'en faisait pas partie, donc j'ai dû fournir les chemins d'inclusion explicitement.
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. L'exécution de cette cmd a compilé 1.cpp en 1.exe qui a imprimé "hi".

Quoi n'a pas fonctionné :

  1. J'ai essayé de construire les mêmes sources llvm+clang sans MinGW+GCC en utilisant le compilateur MSVC de VS 2015 CTP. Il a construit Clang avec succès, la seule différence est que vous devez le faire à partir de la fenêtre CMD du développeur, et vous devez exécuter cmake -G "Visual Studio 12" ..\llvm et ensuite compiler la solution dans Visual Studio. Cependant, Clang n'a pas réussi à compiler un exemple de cpp, il s'est plaint de "undeclared identifier 'char16_t'" et "__int128 is not supported on this target" dans les en-têtes de la bibliothèque standard MinGW. Si j'utilise clang-cl et les en-têtes STL de MS, il se plaint des spécificateurs "throw x(y)". Peut-être que j'ai dû fournir des clés supplémentaires à la construction, mais je n'ai pas réussi à le faire fonctionner.

C:\Program Fichiers (x86) \Microsoft Visual Studio 14.0 \VC\include\xiosbase (293,4) : error : cannot compile this throw expression yet _THROW_NCEE(failure, "ios_base::eofbit set") ; C:\Program Fichiers (x86) \Microsoft Visual Studio 14.0 \VC\include\xstddef (56,30) : note : développé à partir de la macro '_THROW_NCEE' #define _THROW_NCEE(x, y) throw x(y)

2voto

Chawathe Vipul Points 623

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

J'ai utilisé "Visual Studio 11 Win64" avec cmake et cela a fonctionné avec le VS Express actuellement disponible pour le bureau.

J'utilise également MinGW-W pour la librairie. 64 et pour les fichiers manquants SUA. http://mingw-w64.sourceforge.net/ y http://www.suacommunity.com/

Pour lier les .o compilés par clang++ pour une utilisation avec le système W 64 j'utilise -m i386pep avec l'éditeur de liens ld à nouveau fourni avec le logiciel W 64 livrable.

0voto

Jacob Lärfors Points 21

J'ai eu de nombreux problèmes pour construire LLVM et clang en utilisant VS et étant un utilisateur Unix, je préfère construire les sources à partir de la ligne de commande.

En suivant les instructions de Seth Carnegie, je l'ai construit à partir du dépôt SVN plutôt que des paquets fournis, en utilisant LLVM v3.3 avec MinGW v4.5.2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X