Installation et configuration de VS Code
Si ce n’est pas déjà fait, téléchargez et installez Visual Studio Code
Installation de l’extension C/C++ dans VS Code
Installation de l’extension Code Runner. cette extension est facultative mais vous permettra de lancer un code dans un terminal externe pour utiliser les entrées utilisateurs (cin). Dans les paramètres, activez l’option Code-runner: Run In Terminal.
Installation d’un compilateur
Pour compiler, exécuter et analyser votre code vous aurez besoin d’outil comme GNU.
Téléchargez et dézipper une version de GNU Compiler Collection (GCC) s’il n’est pas déjà présent sur votre ordinateur.
g++ --version
Vous pouvez également installer une version de GCC à partir de MSYS2
$ pacman -S mingw-w64-ucrt-x86_64-gcc
Créer votre projet C++
Une fois les différentes extensions installées, vous pouvez créer votre projet C++. Pour cela, créez simplement un dossier, ouvrez VS Code sur ce dossier puis créer un fichier .cpp. Vous pouvez le faire via l’interface VS Code ou en ligne de commande
mkdir myproject cd myproject code .
Copier le code Hello world dans le fichier source.
#include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; }
Compiler et tester votre programme
Pour lancer le code vous pouvez utiliser le menu Run > Start Debugging (F5) qui lancera le programme dans la console de debug ou faire un clique-droit sur l’éditeur et lancer Run Code (Ctrl+Alt+N) qui le lancera dans le terminal (si Code runner est activé)
Vous pouvez également le faire en ligne de commande à partir du terminal
g++ helloworld.cpp # -> a.exe executabl. compile and link
./a.exe # execute file
g++ -S helloworld.cpp # -> helloworld.s assembly source file. compile
g++ -c helloworld.cpp # -> helloworld.o object file. compile and assemble
Ajouter un librairie externe C++ dans VS Code
Vous pouvez ajouter des librairies externes ou créer vos propres librairies. Pour que VS Code compile les librairies avec le programme, vous devez spécifier le chemin d’accès dans le fichier tasks.json (ex: « –include=include/utils.cpp »)
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: g++.exe build active file", "command": "C:\\MinGW\\bin\\g++.exe", "args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", "--include=include/utils.cpp", ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
pour compiler le programmer, il faut compiler et lier les deux fichiers
g++ helloworld.cpp include/utils.cpp -o helloworld
# or
g++ -c helloworld.cpp include/utils.cpp # get object files
g++ -o helloworld.exe helloworld.o include/utils.o
./helloworld.exe #run program
Mesurer le temps d’exécution du programme
Une méthode assez direct pour mesurer le temps d’exécution du programme est d’utiliser la librairie time.h et mesurer le temps écouler entre le début du programme et la fin.
Pour tester le temps d’exécution nous créons une fonction qui compte de 0 à n avec un certain délai entre chaque itération.
void count_to(int n = 10, int delay = 0);
#include <iostream> #include <windows.h> //#include <unistd.h> void count_to(int n, int delay) { for (int i=0;i<=n;i++){ std::cout << i << std::endl; Sleep(delay); } }
Puis dans le code principal, nous mesurons le temps avant et après l’exécution de la fonction count_to()
#include <iostream> #include <time.h> #include "include/utils.h" clock_t start, end; double cpu_time_used; int main() { std::cout << "Hello World" << std::endl; start = clock(); count_to(10,100); end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Execution time: %f seconds\n", cpu_time_used); return 0; }
La console donne le résultat suivant
Hello World
0
1
2
3
4
5
6
7
8
9
10
Execution time: 1.180000 seconds
Utiliser l’outil de Debug de VS Code
La fonction Run and Debug permet d’exécuter le code pas à pas en plaçant des points d’arrêts (breakpoints) à différents endroits du code (identifier à gauche du numéro de ligne par un point rouge). Il permet aussi d’observer les variables et registres au fur et à mesure de l’exécution. Vous pouvez ainsi suivre l’évolution du code pas à pas à la recherche d’erreur éventuelles.
Le code va s’exécuter normalement jusqu’au premier point d’arrêt, vous pouvez ensuite continuer la progression jusqu’au prochain point d’arrêt, ou exécuter le code pas à pas à partir de ce point à l’aide des boutons de navigations
Vous pouvez observer les valeurs des variables ou des registres à chaque étapes dans l’onglet VARIABLES. Ou observer certaines variables dans WATCH.
Vous pouvez également observer le code assembleur compilé à ouvrant la vue « disassembly » à l’aide de clique-droit sur l’éditeur puis « Open Disassembly View ».
Troubleshoot
- « thread » n’est pas reconnu
essayer d’installer MinGW-w64 à partir de MSYS2 et d’ajouter C:\msys64\ucrt64\bin aux variables d’environnement. Vérifier que le compilateur utilisé est g++
- Utilisation de cout lève une erreur segmentation
comme solution intermédiaire, vous pouvez remplacer le cout par des printf
vérifier que la librairie libstdc++-6.dll se trouve au même endroit que le compilateur à l’aide la console de debug de vs code
Loaded 'C:\Program Files\Tesseract-OCR\libstdc++-6.dll'. Symbols loaded.
#instead of
Loaded 'C:\msys64\ucrt64\bin\libstdc++-6.dll'. Symbols loaded.
- Run Code donne des résultats différents de Debug Code
Assurez-vous que les commandes sont les mêmes pour les deux fonctions (pour ma part le flage « -g » posais soucis)
dans le fichier tasks.json (debug)
// "command": "C:\\msys64\\ucrt64\\bin\\g++.exe", "args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ],
dans le fichier settings (code-runner)
"code-runner.executorMap": { "cpp": "cd $dir && g++ -g $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", },