with how for compile windows cmake clang ninja

how - llvm download windows



Construyendo con CMake, Ninja y Clang en Windows (3)

Finalmente encontré una forma de usar mis herramientas favoritas de una manera que me complace. No es perfecto, pero funciona mejor que el enfoque de Florians al configurar el nombre del sistema como Genérico (que he estado usando por algún tiempo)

Primero configuré VS Code para usar el terminal de desarrolladores VS como su terminal estándar. Hice esto agregando la siguiente línea a las preferencias del Código VS

"terminal.integrated.shell.windows": "C://MeineProgramme//Visual_Studio//2017//BuildTools//Common7//Tools//LaunchDevCmd.bat"

Después de iniciar el terminal dentro de VS Code, necesito llamar al archivo de lote respectivo que establece las variables de entorno requeridas (en mi caso vcvars64.bat ). Estos se pueden encontrar en

C:/MeineProgramme/Visual_Studio/2017/BuildTools/VC/Auxiliary/Build

Después de navegar a mi directorio de compilación, ejecuto CMake con las siguientes opciones

cmake .. -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:/MeineProgramme/LLVM/bin/clang-cl.exe" -DCMAKE_LINKER:PATH="C:/MeineProgramme/LLVM/bin/lld-link.exe"

esto alienta a CMake a usar todas mis herramientas LLVM instaladas. No solo clang y lld (asegúrese de usar lld-link que admite las opciones lideradas por un / ), sino también llvm-ar y llvm-ranlib . La única herramienta de compilación de MS utilizada es el compilador de recursos que no uso en este momento.

Hasta ahora el éxito creo.

No dude en contactarme o comentar a continuación si tiene más preguntas.

Queridos compañeros codificadores de C ++,

Después de usar la cadena de herramientas de Visual Studio para construir en Windows por un tiempo, decidí darle una oportunidad a Clang 5.

Instalé los binarios de LLVM 5.0.0, el entorno de compilación de Ninja, las herramientas de VS 2017 y CMake 3.9.3. El objetivo final es poder compilar aplicaciones C y C ++ para Windows usando VS Code con la integración de CMake como "IDE" y Clang con LLD como compilador y enlazador.

La compilación y ejecución de un programa simple funcionó perfectamente bien ( captura de pantalla del historial del terminal respectivo ). Clang detectó automáticamente la biblioteca estándar para Windows dentro de los directorios de VS Tools y produjo un resultado ejecutable.

El siguiente paso fue configurar una compilación simple con Ninja ( captura de pantalla del archivo ninja.build y el historial del terminal ). El proceso de compilación funcionó como se esperaba y produjo un ejecutable funcional, como antes.

Los problemas comenzaron cuando comencé a integrar CMake en el proceso. Mi expectativa es que CMake produzca un archivo de compilación ninja y lo ejecute, ¿correcto? Probé el siguiente archivo CMakeLists

cmake_minimum_required(VERSION 3.9) project(Test) add_executable(Test main.c)

y se llama CMake con cmake -G Ninja . El resultado resultante fue decepcionante y no entiendo lo suficiente como para resolver el problema, yo mismo.

-- The C compiler identification is Clang 5.0.0 -- The CXX compiler identification is Clang 5.0.0 -- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe -- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe -- broken CMake Error at C:/Meine_Programme/CMake/share/cmake-3.9/Modules/CMakeTestCCompiler.cmake:51 (message): The C compiler "C:/Meine_Programme/LLVM/bin/clang.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: D:/Dateien/Downloads/Test/CMakeFiles/CMakeTmp Run Build Command:"C:/Meine_Programme/Ninja_Build/ninja.exe" "cmTC_eeb5c" [1/2] Building C object CMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj FAILED: CMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj C:/Meine_Programme/LLVM/bin/clang.exe /nologo /DWIN32 /D_WINDOWS /W3 /MDd /Zi /Ob0 /Od /RTC1 /showIncludes /FoCMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj /FdCMakeFiles/cmTC_eeb5c.dir/ -c testCCompiler.c clang.exe: error: no such file or directory: ''/nologo'' clang.exe: error: no such file or directory: ''/DWIN32'' clang.exe: error: no such file or directory: ''/D_WINDOWS'' clang.exe: error: no such file or directory: ''/W3'' clang.exe: error: no such file or directory: ''/MDd'' clang.exe: error: no such file or directory: ''/Zi'' clang.exe: error: no such file or directory: ''/Ob0'' clang.exe: error: no such file or directory: ''/Od'' clang.exe: error: no such file or directory: ''/RTC1'' clang.exe: error: no such file or directory: ''/showIncludes'' clang.exe: error: no such file or directory: ''/FoCMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj'' clang.exe: error: no such file or directory: ''/FdCMakeFiles/cmTC_eeb5c.dir/' ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:3 (project) -- Configuring incomplete, errors occurred! See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeOutput.log". See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeError.log".

Supongo que el problema está relacionado con CMake llamando al clang con opciones de estilo VS usando barra diagonal en lugar de precedido por menos, como el clang requiere.

Gracias por ayudarme chicos, lo aprecio :-)

Solo déjame un comentario si necesitas más información.

Respuesta a la publicación de Florians.

Intenté el comando de Florians pero omití el camino a ninja para una notación más corta y resultó que funcionaba bien.

cmake -E env LDFLAGS="-fuse-ld=lld" cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:/MeineProgramme/LLVM/bin/clang.exe" -DCMAKE_CXX_COMPILER:PATH="C:/MeineProgramme/LLVM/bin/clang++.exe" -DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_CXX_COMPILER_ID="Clang" -DCMAKE_SYSTEM_NAME="Generic"

CMake produjo un archivo de construcción ninja.

Corrí ninja all para construir el ejecutable como Test . Test.exe nombre a Test.exe y el programa se ejecutó felizmente. Hasta ahora ... el éxito! Pero mucho más complicado de lo que esperaba.


Inspirado en la publicación del blog "Maneras de compilar con Clang en Windows" de @Unspongeful y después de algunas pruebas extendidas, la siguiente línea de comandos funcionó para mí (y sí, es un comando grande que acabo de dividir en varias líneas para una mejor lectura):

> cmake -E env LDFLAGS="-fuse-ld=lld-link" PATH="<path/to/ninja>" cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="%ProgramFiles(x86)%/LLVM/bin/clang.exe" -DCMAKE_CXX_COMPILER:PATH="%ProgramFiles(x86)%/LLVM/bin/clang.exe" -DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_CXX_COMPILER_ID="Clang" -DCMAKE_SYSTEM_NAME="Generic"

Aquí hay alguna información de fondo:

Parece que en este momento tienes que pasar por alto muchas de las comprobaciones automáticas de CMake para que funcione. Entonces, probablemente consulte con el equipo de CMake o plantee un problema para que este escenario sea oficialmente compatible.

Y la última parte con un sistema Generic probablemente no sea la mejor opción, ya que omitirá la configuración específica de Windows como el sufijo .exe .

Pero fue la única constelación que realmente funcionó:

-- The C compiler identification is Clang -- The CXX compiler identification is Clang -- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: build


Me estaba topando con problemas similares al intentar usar clang cmake y msvc 2017 juntos. Al menos para un proyecto de prueba muy simple, pude hacer que todo funcionara, pero soy bastante nuevo en eso, así que tal vez mi solución no resuelva tus problemas.

De todas formas. Por lo que sé, debes usar clang-cl.exe lugar de clang.exe con VS. Sin embargo, la construcción aún no funcionó en las configuraciones x86 debido a algunos problemas del enlazador relacionados con las incompatibilidades de la biblioteca x86 vs x64.

Así que aquí está mi solución para obtener configuraciones tanto de x64 como de x86, integradas en VS 2017.

  1. Descargue e instale AMBOS instaladores de windows clang / llvm desde http://releases.llvm.org/download.html . No es necesario que los agregue a la ruta, ya que la especificaremos explícitamente más adelante.
  2. Cree una carpeta con un CMakeLists.txt y CMakeLists.txt en VS mediante el cuadro de diálogo Open Folder .
  3. En el menú CMake , seleccione Change CMake Settings > CMakeLists.txt . Esto generará un CMakeSettings.json contiene configuraciones para todas las configuraciones de construcción.
  4. Especifique las rutas de los compiladores de cmake x64 / x86 en cmakeCommandArgs para todas las configuraciones. El mío se parece a esto:

    { // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. "configurations": [ { "name": "x86-Debug", "generator": "Ninja", "configurationType": "Debug", "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//build//${name}", "installRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//install//${name}", "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x86-Release", "generator": "Ninja", "configurationType": "RelWithDebInfo", "inheritEnvironments": [ "msvc_x86" ], "buildRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//build//${name}", "installRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//install//${name}", "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x64-Debug", "generator": "Ninja", "configurationType": "Debug", "inheritEnvironments": [ "msvc_x64" ], "buildRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//build//${name}", "installRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//install//${name}", "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe", "buildCommandArgs": "-v", "ctestCommandArgs": "" }, { "name": "x64-Release", "generator": "Ninja", "configurationType": "RelWithDebInfo", "inheritEnvironments": [ "msvc_x64" ], "buildRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//build//${name}", "installRoot": "${env.USERPROFILE}//CMakeBuilds//${workspaceHash}//install//${name}", "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe", "buildCommandArgs": "-v", "ctestCommandArgs": "" } ]

    }

Ahora debería poder construir configuraciones x64 y x86 sin errores.