Cómo compilar Clang en Windows

 C Programming >> Programación C >  >> Tags >> Clang
Cómo compilar Clang en Windows


He estado tratando de encontrar una manera de hacer que Clang funcione en Windows, pero tengo problemas. Hago que Clang compile con éxito, pero cuando intento compilar un programa tengo un montón de errores en los encabezados estándar.


Conozco las excelentes versiones prediseñadas de clang de rubenvb, pero quiero compilarlas por mí mismo. También estaba escuchando las charlas de GoingNative sobre clang que decían que aún no tenía muy buen soporte de Windows. ¿Cómo puedo hacer que clang funcione en Windows?


Respuestas:


Usé el siguiente método para compilar clang para C++ en Windows 7 y ha sido validado por Mysticial y otros:



  1. Descargue e instale MinGW (asegúrese de instalar el compilador de C++) y coloque la carpeta bin en su PATH (tengo MinGW 4.6.1 y probé con éxito en otra computadora con 4.6.2)

  2. Asegúrese de tener Python en su RUTA (no 3 , tengo 2.7)

  3. (Opcional:asegúrese de tener Perl en su PATH (utilicé ActivePerl 5.14.2 de 64 bits))

  4. Obtenga CMake y póngalo en su PATH

  5. Vaya a la página de descargas de LLVM y descargue el código fuente de LLVM 3.0 junto con el código fuente de Clang. No obtenga el código del SVN, no funciona con los encabezados de MinGW.

  6. Extraiga los códigos fuente; Tenía la fuente llvm en una carpeta llamada llvm-3.0.src en mi escritorio

  7. Coloque la fuente de clang directamente en una carpeta llamada "clang" (debe llamarse así exactamente o construirá llvm pero clang no se construirá) en la carpeta "herramientas" dentro de la carpeta de origen de llvm, esto debería hacer sus directorios se ven así:

    • fuente de llvm

      • carpeta autoconf

      • ...

      • carpeta de herramientas

        • ...

        • carpeta clang

          • carpeta de enlaces

          • ...

          • Archivo Makefile

          • ...


        • ...


      • ...



  8. Cree una carpeta llamada "build" en el mismo directorio que la carpeta de origen de llvm

  9. Abra una línea de comando y cd en la carpeta de compilación

  10. Ejecute el comando cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src



    • (el último argumento es la ruta relativa a la carpeta que contiene la fuente llvm (y la fuente clang en el subdirectorio tools/clang))


    • Esto hará el equivalente a un comando de "configuración", y los archivos MAKE y todo se generarán en la carpeta de compilación


    • Esto tomará unos minutos


  11. Ejecute el comando mingw32-make



    • Esto compilará llvm y clang, y los ejecutables de clang se generarán en la carpeta build/bin

    • Esto probablemente llevará mucho tiempo. (Puede intentar acelerarlo agregando compilaciones paralelas, -j<number> opción) Podría ser bueno cerrar todos los demás programas para que su computadora pueda concentrarse, y para que no interfieran con el largo proceso de compilación, como poner un candado en una carpeta en la que el compilador está escribiendo (a mí me pasó ). Incluso apagué mi software antivirus y de firewall para que no intentaran escanear los archivos generados y estorbaran.



Hora de probarlo



  1. Cree un archivo .cpp en la carpeta build/bin (usaré hello.cpp). Utilice un encabezado de biblioteca estándar para asegurarse de que las rutas de inclusión y las bibliotecas funcionen. Comience con un programa muy simple.


    (Con lo que comencé:


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

    )


  2. Ejecute el comando 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 especifica un directorio en el que buscar bibliotecas y -l especifica una biblioteca para vincular)
    (Si no tiene MinGW instalado en la misma ruta que yo, puede encontrar las rutas con el comando "g++ somefile.cpp -v" para que g++ se explique qué opciones está usando para las rutas de la biblioteca y los archivos de la biblioteca y todo lo demás
    Busque cerca del final de la salida las opciones -L y -l Tenga en cuenta los nombres de archivo .o que se intercalan con las -L. Clang usa muchas de las mismas opciones que g++, así que literalmente copié y pegué esa línea de la salida de g++)


    Esto debería compilar su programa y producir un archivo llamado a.out


  3. cambiar el nombre de a.out a a.exe o lo que sea


  4. Ejecute el .exe

  5. Su programa debería ejecutarse.


Clang (3.0) todavía tiene algunos problemas en Windows (no sé si estos problemas también están en Linux). Por ejemplo, compilar una lambda (que no es compatible con clang) con -std=c++0x hará que clang se bloquee y emita un error de diagnóstico.
(Me informaron en el IRC de LLVM que esto se debe a que clang implementa el análisis de lambdas pero no el análisis semántico, que es la fase en la que falla (porque se olvidaron de deshabilitar el análisis de lambdas para la versión 3.0) y ya conocen este error)


Además, el ilustre Místico accedió amablemente a probar esta guía e hizo algunas observaciones durante su prueba:



  1. Los encabezados de Windows parecen funcionar.

  2. Actualmente solo funciona para 32 bits.

  3. 64 bits se compila bien, pero no se ensambla.

  4. SSE probablemente esté bien. (Sin embargo, [Mysticial no ha] probado un SSE funcional en 32 bits).


Algunas respuestas de código


 $ 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: