web-dev-qa-db-fra.com

Comment compiler Clang sous Windows

J'ai essayé de trouver un moyen de faire fonctionner Clang sur Windows, mais j'ai des problèmes. J'obtiens Clang pour compiler avec succès, mais quand j'essaye de compiler un programme j'ai un tas d'erreurs dans les en-têtes standard.

Je connais les excellentes versions préconstruites de rubenvb de clang , mais je veux le compiler pour moi. J'écoutais également les discussions de GoingNative sur clang qui disaient qu'il n'avait pas encore un très bon support Windows. Comment faire fonctionner Clang sous Windows?

50
Seth Carnegie

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échargez et installez MinGW (assurez-vous d'installer le compilateur C++) et placez le dossier bin dans votre CHEMIN (J'ai MinGW 4.6.1 et testé avec succès sur un autre ordinateur avec 4.6.2)
  2. Assurez-vous d'avoir Python dans votre CHEMIN ( pas 3 , j'en ai 2.7)
  3. (Facultatif: assurez-vous que Perl se trouve dans votre CHEMIN (j'ai utilisé ActivePerl 5.14.2 64 bits))
  4. Obtenez CMake et mettez-le dans votre CHEMIN
  5. Accédez à la page de téléchargement de LLVM et téléchargez le code source de LLVM 3.0 avec le code source de Clang. N'obtenez pas le code du SVN, cela ne fonctionne pas avec les en-têtes MinGW.
  6. Extraire les codes sources; J'avais la source llvm dans un dossier nommé llvm-3.0.src sur mon bureau
  7. Mettez la source de clang directement dans un dossier appelé "clang" (il faut l'appeler exactement ou vous construirez llvm mais clang ne sera pas construit) dans le dossier "tools" à l'intérieur du dossier source de llvm, cela devrait donner à vos répertoires comme:
    • source llvm
      • dossier autoconf
      • ...
      • dossier d'outils
        • ...
        • dossier clang
          • dossier de liaisons
          • ...
          • Fichier Makefile
          • ...
        • ...
      • ...
  8. Créez un dossier nommé "build" dans le même répertoire que le dossier source llvm
  9. Ouvrez une ligne de commande et un CD dans le 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 d'accès relatif au dossier contenant la source llvm (et la source clang dans le sous-répertoire tools/clang))

    • Cela fera l'équivalent d'une commande "configure", et les makefiles et tout 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 versions parallèles, -j<number> option) Il peut être judicieux de fermer tous les autres programmes pour que votre ordinateur puisse se concentrer et pour qu'ils n'interfèrent pas avec le long processus de compilation, comme mettre un verrou sur un dossier dans lequel le compilateur écrit (c'est arrivé pour moi). J'ai même désactivé mon logiciel antivirus et pare-feu pour qu'ils n'essaient pas d'analyser les fichiers générés et de s'immiscer.

Il est temps de le tester

  1. Créez un fichier .cpp dans le dossier build/bin (j'utiliserai hello.cpp). Utilisez un en-tête de bibliothèque standard pour vous assurer que les chemins d'accès et les bibliothèques fonctionnent. Commencez avec 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 rechercher des bibliothèques et -l spécifie une bibliothèque à lier) (Si MinGW n'est pas installé sur le même chemin que moi, vous pouvez trouver les chemins avec la commande "g ++ somefile. cpp -v "pour que g ++ renverse ses tripes sur les options qu'il utilise pour les chemins de bibliothèque et les fichiers de bibliothèque et tout le reste Recherchez à la fin de la sortie les options -L et -l. Soyez conscient du fichier .o noms qui sont entrecoupés de -L. Clang utilise plusieurs 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. renommer a.out en a.exe ou autre

  4. Exécutez le .exe
  5. Votre programme devrait s'exécuter.

Clang (3.0) a toujours des problèmes sur Windows (je ne sais pas si ces problèmes sont également sur Linux). Par exemple, la compilation d'un lambda (que clang ne prend pas en charge) avec -std = c ++ 0x provoquera le plantage de clang et émettra une erreur de diagnostic. (J'ai été informé sur le LLVM IRC 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 se bloque (parce qu'ils ont oublié de désactiver l'analyse syntaxique des lambdas pour le 3.0) version), et ils connaissent déjà ce bug)

De plus, l'illustre Mysticial a aimablement accepté de tester ce guide et a fait quelques observations lors de ses tests:

  1. Les en-têtes Windows semblent fonctionner.
  2. Actuellement, ne fonctionne que pour 32 bits.
  3. 64 bits se compile bien, mais ne s'assemble pas.
  4. SSE est probablement très bien. ([Mysticial n'a pas] testé un SSE sur 32 bits cependant).)
56
Seth Carnegie

Voici ce qui a fonctionné dans mon environnement, sur Windows 8.1, globalement similaire aux instructions de Seth, mais avec des outils plus récents.

  1. J'ai installé MinGW 64 dans C:/MinGW, pour être précis, j'ai utilisé distribution STL .
  2. J'ai installé Python 3, je viens de prendre leur dernière version.
  3. J'ai installé CMake 3.0.2
  4. J'ai bifurqué LLVM et Clang sur Github et les ai clonés sur ma machine, en plaçant le dépôt de Clang dans le dossier llvm\tools\clang (le dossier 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. Ensuite, j'ai lancé "make" pour réellement 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 "salut":
#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 correctement la variable PATH via d'autres moyens. Notez que la version GCC de votre package MinGW peut être différente. Clang a également des chemins intégrés qu'il essaie, mais ils sont liés à des versions spécifiques de GCC, et le mien n'en faisait pas partie, j'ai donc dû fournir explicitement les chemins d'inclusion.
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 ce cmd a compilé 1.cpp en 1.exe qui a imprimé "salut".

Ce qui 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 Developer CMD et que vous devez exécuter cmake -G "Visual Studio 12" ..\llvm, puis compilez la solution dans Visual Studio. Cependant, que Clang n'a pas réussi à compiler un exemple de cpp, il s'est plaint de "l'identifiant non déclaré 'char16_t'" et "__int128 n'est pas pris en charge sur cette cible" dans les en-têtes de bibliothèque standard MinGW. Si j'utilise des en-têtes clang-cl et MS STL, cela se plaint des spécificateurs "throw x (y)". Peut-être que je devais fournir des clés supplémentaires à la construction, mais je n'ai pas pu le faire fonctionner.

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xiosbase (293,4): erreur: ne peut pas encore compiler cette expression de lancement _THROW_NCEE (échec, "ios_base :: eofbit set"); C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xstddef (56,30): remarque: développé à partir de la macro '_THROW_NCEE' #define _THROW_NCEE (x, y) throw x (y)

5
Max Galkin

Reportez-vous http://clang.llvm.org/get_started.html#buildWindows

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

Aussi pour la bibliothèque, j'utilise MinGW-W 64 et pour les fichiers manquants SUA. http://mingw-w64.sourceforge.net/ et http://www.suacommunity.com/

Pour lier .o compilé par clang ++ pour une utilisation avec les binaires W 64 , j'utilise -m i386pep avec l'éditeur de liens ld à nouveau livré dans le W 64 livrable.

2
Chawathe Vipul

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

En suivant les instructions de Seth Carnegie, je l'ai construit à partir du référentiel SVN par opposition aux packages fournis, en utilisant LLVM v3.3 avec MinGW v4.5.2.

0
Jacob Lärfors