Construyendo con CMake, Ninja y Clang en Windows
Estimados 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 LLVM 5.0.0, el entorno de compilación Ninja, las herramientas 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 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 lib estándar para Windows dentro de los directorios de VS Tools y produjo una salida ejecutable.
El siguiente paso fue configurar una compilación simple con Ninja (captura de pantalla del archivo ninja.build y del 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 produce un archivo de compilación ninja y lo ejecuta, ¿correcto? Intenté el siguiente archivo CMakeLists
cmake_minimum_required(VERSION 3.9)
project(Test)
add_executable(Test main.c)
y llamó a CMake concmake -G Ninja
. El resultado resultante fue decepcionante y no entiendo lo suficiente como para resolver, respectivamente, 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 a clang con opciones de estilo VS usando una barra diagonal en lugar de precedido por menos, como requiere clang.
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é con el comando Florians pero omití el camino hacia ninja para una notación más corta y resultó funcionar 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 compilación ninja.
corríninja all
para construir el ejecutable comoTest
. Lo renombré aTest.exe
y el programa se ejecutó felizmente. Hasta ahora ... éxito !!! Pero mucho más complicado de lo que esperaba.