fbpixel
Étiquettes :

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

vscode-cpp-extension Programmer en C++ avec 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.

vscode-code-runner-extension Programmer en C++ avec VS Code

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é)

vscode-cpp-debug Programmer en C++ avec VS Code
vscode-cpp-run-code Programmer en C++ avec VS Code

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

vscode-navigate-breakpoint Programmer en C++ avec VS Code

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 ».

vscode-cpp-debug-breakpoint Programmer en C++ avec VS Code

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",

    },

Sources