web-dev-qa-db-fra.com

Clang sur Windows

Tout d'abord, j'ai suivi "Mise en route: construction et exécution de Clang" . En particulier, je l'ai construit selon la section "Utilisation de Visual Studio". En d'autres termes, je l'ai construit à l'aide de Visual Studio 2010.

Deuxièmement, j'ai défini manuellement les chemins d'inclusion et de bibliothèque pour la distribution MinGW:

enter image description here

Le programme simple que j'essaye de compiler:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

Je reçois les commentaires suivants du compilateur:

In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ios:38:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iosfwd:41:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\bits/postypes.h:41:
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:144:11: error: no member named 'fgetws' in the global namespace
  using ::fgetws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:146:11: error: no member named 'fputws' in the global namespace
  using ::fputws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:150:11: error: no member named 'getwc' in the global namespace
  using ::getwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:151:11: error: no member named 'getwchar' in the global namespace
  using ::getwchar;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:156:11: error: no member named 'putwc' in the global namespace
  using ::putwc;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:157:11: error: no member named 'putwchar' in the global namespace
  using ::putwchar;
        ~~^
6 errors generated.
Build error occurred, build is stopped
Time consumed: 646  ms.  

La question évidente est - pourquoi est-ce que je reçois ceci?

De plus, je voudrais en savoir plus et depuis, le site Web de Clang fournit des informations extrêmement brèves - je pensais que quelqu'un pourrait me clarifier les questions suivantes:

  1. Autant que je sache, Clang n'a pas sa propre bibliothèque standard (stdc ++ je suppose, n'est-ce pas?). C'est pourquoi je dois utiliser les en-têtes et les bibliothèques de MinGW - ai-je raison?
  2. Quelle est la différence entre la création de Clang avec Visual Studio et MinGW?
  3. Dois-je coder en dur les chemins d'inclusion dans clang/lib/Frontend/InitHeaderSearch.cpp ou je peux l'ignorer et plutôt spécifier ces chemins plus tard via l'option "-I" comme je le fais dans la capture d'écran ci-dessus?
23
Alexander Shukaev

Si vous construisez Clang avec MSVS, il recherchera automatiquement les chemins d'inclusion VS par défaut et récupérera ces en-têtes. C'est la raison pour laquelle les en-têtes libstdc ++ génèrent des erreurs: ils importent des fonctions C non présentes dans les en-têtes VS. L'utilisation de Clang pour C++ avec VS est pour l'instant un pas: vous obtiendrez des échecs de liaison en raison de la fonctionnalité ABI (nom mangling et autres) manquante dans Clang. Si vous souhaitez toujours utiliser le MSVS Clang, ne le pointez pas vers les en-têtes MinGW. Il analysera les en-têtes VS (y compris C++), il ne réussira tout simplement pas à lier.


[~ # ~] edit [~ # ~] : J'ai construit une version dw2 de GCC (32 bits uniquement) accompagnée de Clang. Les exceptions fonctionnent dans cette version, et vous pouvez donc créer de vraies choses C++ avec Clang maintenant sur Windows. Obtenez la version 3.2 ici .

32
rubenvb

La réponse évidente est que vous avez oublié d'envoyer la compatibilité -fno-ms à clang ++: P

  1. Vous avez raison.
  2. VC++ est une chaîne d'outils GUI, MinGW est une console de caractères.
  3. Non, car Clang est suffisamment mature pour la consommation publique, mais reste à stabiliser, alors laissez son équipe de développeurs travailler sur le code, sinon vous risquez de perdre du travail. J'utilise -I comme le suggère votre exemple.

Je fais du développement d'applications Windows en utilisant VS et j'utilise clang + CodeBlocks pour partager des aspects neutres avec le domaine de la plateforme.

1
Chawathe Vipul