Chers collègues codeurs C++,
après avoir utilisé la chaîne d'outils Visual Studio pour la construction de fenêtres pendant un certain temps, j'ai décidé d'essayer Clang 5.
J'ai installé les fichiers binaires de LLVM 5.0.0, l'environnement de construction Ninja, les outils VS 2017 et CMake 3.9.3. L'objectif final est de pouvoir compiler des applications C et C++ pour Windows en utilisant VS Code avec l'intégration de CMake en tant qu '"IDE" et Clang avec LLD en tant que compilateur et éditeur de liens.
La compilation et l'exécution d'un programme simple ont parfaitement fonctionné ( capture d'écran de l'historique du terminal respectif ). Clang a automatiquement détecté la bibliothèque standard pour Windows dans les répertoires de VS Tools et a généré une sortie exécutable.
L'étape suivante consistait à configurer une construction simple avec Ninja ( capture d'écran du fichier ninja.build et de l'historique du terminal ). Le processus de construction a fonctionné comme prévu et a généré un exécutable fonctionnel, comme avant.
Les problèmes ont commencé lorsque j'ai commencé à intégrer CMake au processus. Mon attente est que CMake produise un fichier de construction ninja et l'exécute, exact? J'ai essayé le fichier CMakeLists suivant
cmake_minimum_required(VERSION 3.9)
project(Test)
add_executable(Test main.c)
et appelé CMake avec cmake -G Ninja
. La sortie résultante a été décevante et je ne comprends pas assez pour résoudre le problème moi-même.
-- 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".
Je suppose que le problème est lié au clang d’appel de CMake avec les options de style VS utilisant une barre oblique au lieu de précédé de moins, comme le requiert Clang.
Merci de m'avoir aidé les gars, je l'apprécie :-)
Laissez-moi juste un commentaire si vous souhaitez des informations complémentaires.
Réponse au message de Florians
J'ai essayé la commande Florians mais omis le chemin vers ninja pour une notation plus courte et cela s'est avéré très bien fonctionner.
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 a créé un fichier de construction ninja.
J'ai exécuté ninja all
pour construire l'exécutable sous la forme Test
. Je l'ai renommé en Test.exe
et le programme a été exécuté avec bonheur. Jusqu'ici ... succès !!! Mais beaucoup plus compliqué que prévu.
J'ai enfin trouvé le moyen d'utiliser mes outils préférés d'une manière qui me plaise. Ce n'est pas parfait, mais cela fonctionne mieux que l'approche de Florians en définissant le nom du système sur Generic (que j'utilise depuis quelque temps déjà)
J'ai d'abord configuré VS Code pour utiliser le terminal de développeur VS comme terminal standard. Je l'ai fait en ajoutant la ligne suivante aux préférences du code VS
"terminal.integrated.Shell.windows": "C:\\MeineProgramme\\Visual_Studio\\2017\\BuildTools\\Common7\\Tools\\LaunchDevCmd.bat"
Après avoir démarré le terminal dans VS Code, je dois appeler le fichier de traitement correspondant qui définit les variables d’environnement requises (dans mon cas, vcvars64.bat
). Ceux-ci peuvent être trouvés dans
C:\MeineProgramme\Visual_Studio\2017\BuildTools\VC\Auxiliary\Build
Après avoir accédé à mon répertoire de construction, je lance CMake avec les options suivantes
cmake .. -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang-cl.exe" -DCMAKE_LINKER:PATH="C:\MeineProgramme\LLVM\bin\lld-link.exe"
cela encourage CMake à utiliser tous mes outils LLVM installés. Non seulement clang
et lld
(assurez-vous d'utiliser lld-link qui supporte les options précédées d'un /
), mais également llvm-ar
et llvm-ranlib
. Le seul outil de compilation utilisé par MS est le compilateur de ressources que je n’utilise pas pour le moment.
Jusqu'ici le succès je pense.
N'hésitez pas à me contacter ou à commenter ci-dessous si vous avez d'autres questions.
Inspiré par le "Méthodes de compilation avec Clang sous Windows" billet de blog de @Unspongeful et après quelques tests étendus, la ligne de commande suivante a fonctionné pour moi (et oui, c’est une grosse commande que je viens de séparer en plusieurs lignes pour une meilleure lisibilité):
> 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"
Voici quelques informations de base:
J'ai injecté vos drapeaux d'éditeur de liens avec la variable d'environnement LDFLAGS
J'ai réduit la variable d'environnement PATH
au point d'indiquer simplement où se trouvait ninja
, car CMake choisissait ma chaîne d'outils MinGW
(que je ne voulais pas inclure dans le processus de construction).
Définir les identifiants du compilateur "contourne la vérification des tests de fonctionnement du compilateur et des informations de base du compilateur"
Voir obsolète, mais parfois utile CMakeForceCompiler
module
Et j’ai mis CMAKE_SYSTEM_NAME
à Generic
pour éviter d’avoir ajouté des indicateurs supplémentaires du compilateur/de l’éditeur de liens à la plate-forme ajoutée par CMake
Voir Comment désactiver partiellement la vérification du compilateur personnalisé de cmake C/C++
Il semble pour le moment que vous deviez éviter beaucoup de contrôles automatiques de CMake pour que tout fonctionne correctement. Donc, vérifiez probablement avec l’équipe de CMake ou soulevez un problème pour que ce scénario soit officiellement supporté.
Et la dernière partie avec un système Generic
n'est probablement pas le meilleur choix, car elle ignorera les paramètres spécifiques à Windows tels que le suffixe .exe
.
Mais c'était la seule constellation qui fonctionnait réellement:
-- 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
Je rencontrais des problèmes similaires lorsque j'essayais d'utiliser clang cmake et msvc 2017 ensemble. Au moins pour un projet de test très simple, j’ai pu tout faire fonctionner, mais je suis assez novice dans ce domaine, alors peut-être que ma solution ne résoudra pas vos problèmes.
En tous cas. Autant que je sache, vous devriez utiliser clang-cl.exe
plutôt que clang.exe
avec VS. Cependant, la construction échouait toujours pour moi dans les configurations x86 en raison de problèmes de lieur liés aux incompatibilités de librairies x86 et x64.
Alors voici ma solution pour obtenir les deux configurations, x64 et x86, construites dans VS 2017.
CMakeLists.txt
et ouvrez-le dans VS via la boîte de dialogue Open Folder
.CMake
, sélectionnez Change CMake Settings > CMakeLists.txt
. Cela générera un CMakeSettings.json
contenant les paramètres pour toutes les configurations de construction.Spécifiez les chemins des compilateurs x64/x86 cmake dans la variable cmakeCommandArgs
pour toutes les configurations. Le mien ressemble à ceci:
{ // 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": ""
}
]
}
Vous devriez maintenant pouvoir créer des configurations x64 et x86 sans erreurs.