2012-01-16 13 views
23

En primer lugar, he seguido "Getting Started: Building and Running Clang". En particular, lo he construido de acuerdo con la sección "Uso de Visual Studio". En otras palabras, he construido usando Visual Studio 2010.Clang en Windows

En segundo lugar, he de forma manual y sistema incluye rutas de biblioteca a la distribución MinGW:

enter image description here

El sencillo programa que estoy tratando de compilar:

#include <iostream> 
using namespace std; 

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

me sale el siguiente retroalimentación del compilador:

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 pregunta obvia es: ¿por qué obtengo esto?

Además, me gustaría conocer más detalles, y desde entonces, el sitio web Sonido metálico proporciona extremadamente breve información - pensé que alguien podría aclarar las siguientes preguntas a mí:

  1. Por lo que yo entiendo Clang no lo hace tiene su propia biblioteca estándar (stdC++, supongo, ¿no?). Es por eso que tengo que usar los encabezados y las bibliotecas de MinGW, ¿estoy en lo cierto?
  2. ¿Cuál es la diferencia entre la construcción de Clang con Visual Studio y MinGW?
  3. ¿Tengo que incluir las rutas de acceso de código duro en clang/lib/Frontend/InitHeaderSearch.cpp o puedo omitirlas y especificar las rutas más adelante mediante la opción "-I" como hago en la captura de pantalla anterior?
+2

La combinación que he tenido que trabajar en el pasado es modificar InitHeaderSearch.cpp para incluir la ruta a mis carpetas de inclusión MinGW y luego compilar con la cadena de herramientas MinGW.También he podido construir utilizando la cadena de herramientas de Visual C++, pero no pude averiguar cómo hacer que el compilador incorporado utilice los encabezados y las bibliotecas desde la instalación de MinGW (los encabezados de la Biblioteca estándar de C++ de Visual C++ no pueden ser utilizado porque confían extensamente en características específicas de Visual C++). –

+3

Sí, eso es exactamente en lo que estaba pensando. Pero la mayor confusión para mí es cómo la construcción con Visual C++ o MinGW se relaciona con las rutas de inclusión y biblioteca utilizadas durante la utilización del compilador Clang. En otras palabras, tengo que poder elegir libremente estos caminos después de haber compilado Clang. ¿Por qué demonios estas rutas dependerían del compilador que utilicé para construir Clang? –

+1

@JamesMcNellis: Clang debería ser capaz de analizar los encabezados de VC++ actualmente. El único área problemática de análisis es MFC IIRC. – rubenvb

Respuesta

32

Si compila Clang con MSVS, buscará automáticamente las rutas de acceso de inclusión de VS predeterminadas, y extraiga esos encabezados. Esta es la razón por la cual los encabezados libstdC++ están produciendo errores: están importando funciones C que no están presentes en los encabezados VS. El uso de Clang para C++ con VS es por ahora un no-go: obtendrá fallas en los enlaces debido a la falta de funcionalidad ABI (mangling y otros) en Clang. Si aún desea utilizar MSVS Clang, no lo apunte a encabezados MinGW. Analizará los encabezados VS (incluido C++), simplemente no podrá vincular.


EDITAR: He construido una versión de GCC DW2 (32 bits) acompañado de Sonido metálico. Las excepciones funcionan en esta compilación, por lo que puedes crear cosas C++ reales con Clang ahora en Windows. Get version 3.2 here.

+0

¿Y qué pasa si lo construyo manualmente con MinGW y agrego rutas manualmente como lo hago en la captura de pantalla? –

+1

cualquier paquete binario premezclado de clang? –

+0

@ Mr.Anubis: sí, tengo una versión de Windows de Clang para cada versión de GCC que construí. Simplemente no puedes usarlo solo. – rubenvb

1

La respuesta obvia es que se olvidó de enviar -fno-ms-compatibilidad de clang ++: P

  1. Tiene usted razón.
  2. VC++ es la cadena de herramientas de la GUI, MinGW es la consola de caracteres.
  3. No, ya que el clang es lo suficientemente maduro para el consumo público pero aún así se estabiliza, así que deje que su equipo de desarrollo trabaje en el código; de lo contrario, corre el riesgo de perder la isla. Estoy usando -I como tu ejemplo sugiere.

Estoy haciendo la aplicación de Windows dev usando VS y uso clang + CodeBlocks para compartir aspectos neutrales al dominio de la plataforma.

+1

VC++ <-> MinGW. VC++ no es GUI. Tiene una interfaz de línea de comando. – rubenvb

+0

"GUI tool-chain" no es GUI. Su cadena de herramientas con GUI incluida en la instalación predeterminada. –