Construindo com o CMake, Ninja e Clang no Windows
Caros colegas codificadores C ++,
depois de usar a cadeia de ferramentas do Visual Studio para criar janelas por um tempo, decidi experimentar o Clang 5.
Instalei os binários LLVM 5.0.0, o ambiente de construção Ninja, o VS 2017 Tools e o CMake 3.9.3. O objetivo final é poder compilar aplicativos C e C ++ para Windows usando o VS Code com a integração do CMake como "IDE" e Clang com LLD como compilador e vinculador.
A compilação e execução de um programa simples funcionou perfeitamente bem (captura de tela do histórico do terminal respectivo) Clang detectou automaticamente a lib padrão para Windows nos diretórios do VS Tools e produziu uma saída executável.
O próximo passo foi configurar uma compilação simples com o Ninja (captura de tela do arquivo ninja.build e histórico do terminal) O processo de compilação funcionou conforme o esperado e produziu um executável funcional, como antes.
Os problemas começaram quando comecei a integrar o CMake ao processo. Minha expectativa é que o CMake produza um arquivo de construção ninja e o execute, correto? Eu tentei o seguinte arquivo CMakeLists
cmake_minimum_required(VERSION 3.9)
project(Test)
add_executable(Test main.c)
e chamado CMake comcmake -G Ninja
. A saída resultante foi decepcionante e eu não entendo o suficiente para descobrir, respectivamente, resolver o problema sozinho.
-- 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".
Eu acho que o problema está relacionado ao CMake chamar clang com opções de estilo VS usando barra em vez de precedido por menos, como o clang exige.
Obrigado por me ajudar, pessoal, agradeço :-)
Deixe-me um comentário se precisar de mais informações.
Resposta à publicação da Flórida
Tentei o comando da Flórida, mas omiti o caminho para o ninja para uma notação mais curta e acabou funcionando muito bem.
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"
O CMake produziu um arquivo de construção ninja.
Eu corrininja all
para construir o executável comoTest
. Eu o renomei paraTest.exe
e o programa foi executado com satisfação. Até agora ... sucesso !!! Mas muito mais complicado do que eu esperava.