Bâtiment avec CMake, Ninja et Clang sur Windows
Chers codeurs C++,
après à l'aide de Visual Studio chaîne d'outils pour la construction sur windows depuis un moment, j'ai décidé de donner Clang 5 d'un coup.
J'ai installé la VERSION 5.0.0 binaires, le Ninja de l'environnement de compilation, le VS 2017 Outils et CMake 3.9.3. Le but final est d'être en mesure de compiler des applications C et C++ pour Windows à l'aide de VS de Code avec CMake l'intégration comme "IDE" et Clang avec LLD comme compilateur et l'éditeur de liens.
La compilation et l'exécution d'un programme simple a fonctionné parfaitement bien (capture d'écran de chaque terminal de l'histoire). Clang détecté automatiquement la lib standard pour Windows dans le VS Outils répertoires et produit un exécutable de sortie.
L'étape suivante a été mise en place simple à construire avec Ninja (capture d'écran de ninja.fichier de build et le terminal de l'histoire). Le processus de compilation a fonctionné comme prévu et produit un travail exécutable, tout comme avant.
Les problèmes commencent quand j'ai commencé à intégrer CMake dans le processus. Mon espoir est que CMake produit un ninja fichier de build et l'exécute, correct?
J'ai essayé les CMakeLists fichier
cmake_minimum_required(VERSION 3.9)
project(Test)
add_executable(Test main.c)
et appelé CMake avec cmake -G Ninja
.
Le résultat a été décevant et je ne comprends pas assez de figure, respectivement, de 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é à CMake appel clang avec VS options de style à l'aide de slash au lieu de précédées par moins, comme clang exige.
Merci pour m'avoir aidé les gars, j'apprécie 🙂
Juste me laisser un commentaire si vous avez besoin de plus amples informations.
Réponse à Florians post
J'ai essayé Florians de commande, mais omis le chemin de ninja pour une courte notation et il 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 produit un ninja du fichier build.
J'ai couru ninja all
pour construire l'exécutable comme Test
. Je l'ai renommé pour Test.exe
et le programme exécuté heureusement. De si loin... de la réussite!!! Mais beaucoup plus compliqué que ce que j'attendais.
- Pas de réponse à votre question, mais peut aider: stackoverflow.com/a/38174328/2436175
- Merci pour votre réponse, mais il ressemble à CMake n'est pas en mesure de spécifier un ensemble d'outils pour la Ninja. J'ai essayé
cmake -G Ninja -T LLVM-VS2017
mais il m'a dit, que la spécification d'un ensemble d'outils n'est pas pris en charge pour le générateur, du mauvais :-(je n'aurais pas été surpris si cela a fonctionné parce que, comme mentionné ci-dessus, en fait, je dois avoir tous les outils nécessaires installés à l'exception VS Studio
Vous devez vous connecter pour publier un commentaire.
Inspiré par le "Les moyens pour Compiler avec Clang sur Windows" blog de @Unspongeful et après quelques étendue de tests, la ligne de commande suivante a fonctionné pour moi (et oui, c'est une grosse commande j'ai juste découpé en plusieurs lignes pour une meilleure lisibilité):
Voici quelques informations complémentaires:
J'ai injecté de votre linker drapeaux avec la
LDFLAGS
variable d'environnementVoir En passant les options de compilation avec cmake
J'ai réduit le
PATH
variable d'environnement juste à l'endroit où seninja
est situé, parce que CMake était en train de cueillir mesMinGW
de la chaîne (dont je ne voulais pas inclus dans le processus de construction)Liées à Variable d'environnement utilisée par CMake pour détecter le compilateur Visual C++ outils pour Ninja
Définir le compilateur id "ignore la vérification de travail et d'un compilateur de compilateur basic de renseignements tests"
Voir obsolète, mais parfois utile
CMakeForceCompiler
moduleEt j'ai mis
CMAKE_SYSTEM_NAME
àGeneric
pour éviter d'avoir toute autre plate-forme spécifique compilateur/linker drapeaux ajouté par CMakeVoir Comment partiellement la désactivation de cmake C/C++ compilateur personnalisé vérification
Il semble pour l'instant vous devez vous contourner une grande partie de CMake de vérification automatique, pour le faire fonctionner. Donc probablement vérifier avec le CMake équipe ou soulever une question pour obtenir ce scénario officiellement pris en charge.
Et la dernière partie avec un
Generic
système est probablement pas le meilleur choix, car il va sauter Windows paramètres spécifiques comme la.exe
suffixe.Mais c'était la seule constellation que effectivement travaillées:
ninja
. Puisque c'est laPATH
variable d'environnement nous écraser, il serait dans votre cas vient d'êtrePATH="C:\MeineProgramme\Ninja\bin"
(sans l'exécutable).J'ai enfin trouvé un moyen d'utiliser mon favorisé les outils d'une manière qui me plaît. Il n'est pas parfait, mais il fonctionne mieux que Florians approche avec le paramètre le nom du système d' Générique (que j'ai utilisé pendant un certain temps maintenant)
J'ai d'abord configurer VS Code à utiliser les développeurs de VS terminal terminal standard. Je l'ai fait en ajoutant la ligne suivante à la VS Code préférences
Après le démarrage du terminal au sein d'un VS Code que j'ai besoin d'appeler le fichier de commandes respectives qui définit les variables d'environnement requises (dans mon cas
vcvars64.bat
). Ceux-ci peuvent être trouvés dansAprès avoir accédé à mon répertoire de compilation j'ai lancer CMake avec les options suivantes
cela encourage CMake pour utiliser toutes mes installé LLVM outils. Non seulement
clang
etlld
(assurez-vous d'utiliser lld-link qui prend en charge les options dirigé par un/
), mais aussillvm-ar
etllvm-ranlib
. Le seul MS construire l'outil utilisé est le compilateur de ressources qui je ne l'utilise pas pour le moment.La mesure du succès je pense.
N'hésitez pas à me contacter ou à commenter ci-dessous si vous avez d'autres questions.
x64 Native Tools Command Prompt for VS 2017
raccourci situé àC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\VC
. Ce serait d'appeler levcvars64.bat
automatiquement pour vous.cmd
fenêtre.Visual_Studio\2017\BuildTools\VC\Auxiliary\Build
sur le chemin ou de référencevcvars64.bat
avec le chemin complet. L'appel à cmake est la même dans chaque environnement.this encourages CMake to use all my installed LLVM tools.
. À savoir certains des Paramètres d'Environnement qui ont été mises envcvars64.bat
fait que cela se produise. J'ai demandé si vous précisément ceux qui (Car il ajoute beaucoup).J'ai été en cours d'exécution dans des problèmes similaires lors de l'utilisation de clang cmake et msvc 2017 ensemble. Au moins pour une très simple projet de test, j'ai été en mesure d'obtenir tout ce qui tourne, mais je suis assez nouveau à ce genre de choses, peut-être que ma solution ne résoudra pas votre probles.
De toute façon. Autant que je sache, vous devez utiliser
clang-cl.exe
plutôt queclang.exe
avec VS. Toutefois, en s'appuyant toujours pas pour moi en x86 configurations en raison de certains linker problèmes concernant x86 vs x64 bibliothèque des incompatibilités.Alors, voici ma solution pour obtenir à la fois, x64 et x86 configurations, bâtiment de dans VS 2017.
CMakeLists.txt
, et ouvert que en VS via leOpen Folder
boîte de dialogue.CMake
menu, sélectionnezChange CMake Settings > CMakeLists.txt
. Cela va générer uneCMakeSettings.json
contenant des paramètres pour construire tous les configs.Spécifier les chemins de l'x64/x86 cmake compilateurs dans le
cmakeCommandArgs
pour toutes les configurations. Le mien ressemble à ça:}
Maintenant, vous devriez être en mesure de construire à la fois x64 et x86 configurations sans erreurs.
CMAKE_CXX_COMPILER
argument, dans ce cas.