Erreur d'inclusion dans Visual Studio Code sous Linux
Résolu/Fermémamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 28 avril 2023 à 15:03
- Erreur d'inclusion dans Visual Studio Code sous Linux
- Erreur 0x80070643 - Accueil - Windows
- Microsoft visual c++ runtime - Guide
- Code asci - Guide
- Telecharger fl studio 20 pour pc gratuit complet - Télécharger - Édition & Montage
- Code puk bloqué - Guide
4 réponses
Modifié le 26 avril 2023 à 22:46
Bonjour,
Quelle distribution Linux as-tu installé ? Comment as-tu procédé pour installer la librairie ? Sous Debian et les distributions qui en dérivent (Ubuntu, Mint, ...) le paquet à installer semble être libsfml-dev :
sudo apt update sudo apt install g++ libsfml-dev
Les headers de la librairies sont déployés dans /usr/include/SMFL, comme le montre le contenu du paquet. On retrouve dans cette liste le fichier /usr/include/SFML/Graphics.hpp que tu inclues dans ton code. Comme /usr/include est un dossier standard, ton compilateur (je suppose g++) est sensé retrouver directement tes headers sans options supplémentaires (pas besoin de l'option -I).
Il faudra toutefois veiller à lier (linker) ton programme avec les librairies dont il dépend. Toujours selon le contenu du paquet les librairies sont :
/usr/lib/x86_64-linux-gnu/libsfml-audio.so
/usr/lib/x86_64-linux-gnu/libsfml-graphics.so
/usr/lib/x86_64-linux-gnu/libsfml-network.so
/usr/lib/x86_64-linux-gnu/libsfml-system.so
/usr/lib/x86_64-linux-gnu/libsfml-window.so
Encore une fois /usr/lib/x86_64-linux-gnu est un dossier standard, donc pas besoin de préciser dans quel dossier le compilateur devra chercher les librairies (options -L et/ou -Wl,R). Mais il faut quand même indiquer au compilateur la ou les librairies auxquelles te lier avec l'option -l). Lier le programme à libtoto.so s'écrit -ltoto lors de la compilation donc dans ton cas, je dirais que ton programme se compile ainsi (certaines librairies listées ci-dessous ne sont pas nécessaires comme nous allons le voir juste après) :
g++ main.cpp -o mon_application -lsfml-audio -lsfml-graphics -lsfml-network -lsfml-system -lsfml-window
Maintenant, si on se penche sur ce tutoriel on peut améliorer la commande de compilation précédente :
g++ main.cpp -o mon_application -lsfml-graphics -lsfml-window -lsfml-system
Ensuite, ton programme mettra vraisemblablement à terme plusieurs fichiers C++ et chacun d'eux devra être compilé individuellement (option -c, permet de compiler un ".cpp" en ".o") puis rassemblés avec une ultime commande de compilation (qui comprend tous les ".o" et toutes les options de linkage). On comprend rapidement que ça va devenir très fastidieux à la main et qu'on a intérêt à prévoir un Makefile pour compiler le programme avec la commande make all et sudo make install (cette commande signifie : lit le fichier Makefile dans le dossier courant et exécute les cibles all et install).
De nos jours, on écrit rarement soi-même ledit fichier Makefile (ça arrive sur de tous petits projets quand on est pressés, mais ça n'est pas l'idéal, notamment car le Makefile qu'on écrit dépend du compilateur, du système d'exploitation, etc.). Dans des temps reculés on utilisait des outils comme automake mais c'est peu évident à mettre en place. Bref, pour toutes ces raisons, je te conseille de plutôt opter pour cmake. Si tu développes avec kdevelop (et je suppose anjuta aussi ?), il est d'ailleurs possible d'initialiser ton projet pour utiliser cmake. Etant donné un fichier CMakeLists.txt, la commande cmake produit un fichier Makefile conforme à ton installation, que tu peux alors utiliser au travers de la commande make. Généralement, on crée un dossier build à la racine du projet et c'est ici qu'on construira tout. Depuis ce dossier on lance alors :
cmake .. make all sudo make install
Bonne chance
Modifié le 27 avril 2023 à 15:58
Bonjour,
Merci d'éviter les captures d'écran (peu écologiques et peu pratiques) quand un simple copier coller et un partage d'extrait de code peuvent suffire.
Installation
Dans ton cas tu n'as besoin d'installer explicitement que de g++ (puisque c'est du C++), gcc sert pour du code en C pur. De la même manière clang est un autre compilateur C dont tu n'as pas besoin. Ainsi cette commande aurait suffit :
sudo apt update sudo apt install g++ libsfml-dev
Compilateur
Le compilateur indiqué dans la configuration de ton projet devrait être g++ (pas gcc). Si tu utilises un compilateur C pour compiler du C++ ça ne marchera pas.
Exemple :
toto.cpp
#include <iostream> int main() { std::cout << "hello" << std::endl; return 0; }
Compilation avec gcc toto.cpp :
(mando@silk) (~) $ gcc toto.cpp
/usr/bin/ld: /tmp/ccbEYG74.o: attention: réadressage sur « _ZSt4cout » dans la section en lecture seule « .text »
/usr/bin/ld : /tmp/ccbEYG74.o : dans la fonction « main » :
toto.cpp:(.text+0x11) : référence indéfinie vers « std::cout »
/usr/bin/ld : toto.cpp:(.text+0x19) : référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) »
/usr/bin/ld : toto.cpp:(.text+0x20) : référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) »
/usr/bin/ld : toto.cpp:(.text+0x2b) : référence indéfinie vers « std::ostream::operator<<(std::ostream& (*)(std::ostream&)) »
/usr/bin/ld : /tmp/ccbEYG74.o : dans la fonction « __static_initialization_and_destruction_0(int, int) » :
toto.cpp:(.text+0x5e) : référence indéfinie vers « std::ios_base::Init::Init() »
/usr/bin/ld : toto.cpp:(.text+0x79) : référence indéfinie vers « std::ios_base::Init::~Init() »
/usr/bin/ld: attention: création de DT_TEXTREL dans un PIE
collect2: error: ld returned 1 exit status
Compilation avec g++ toto.cpp : pas d'erreur
Inclusion des headers
L'option includePath correspond à l'option -I dans gcc/g++. Tu peux la garder, mais elle permet uniquement d'inclure plus facilement les headers impliqués dans le code source de ton projet (pas les headers extérieurs, comme ceux de SFML). Tu pourrais préciser qu'il faut chercher des headers dans /usr/include, mais normalement ça devrait être directement fait par g++, sans passer d'option particulière.
Si ton projet est bien configuré, ton IDE ne devrait pas souligner en rouge les include.
Ajout des librairies externes
Je suppose que tu peux ajouter dans ce fichier de configuration les librairies auxquelles tu te lies. Je t'invite à regarder cette discussion.
cmake
Quoi qu'il en soit, ce fichier de configuration dépend ton IDE (VisualStudio). Cela signifie que si tu redistribues ton code, à moins que les autres développeurs utilisent eux-même VisualStudio et que tu aies partagé le fichier de configuration de ton projet, ils galéreront aussi à compiler ton projet. La manière "propre" de procéder et donc plutôt d'utiliser cmake et de créer un projet basé sur cmake dans ton IDE (et qui est semble-t'il supporté dans VisualStudio, voir ce lien).
Personnellement j'aurais donc tendance à partir dès le début sur des bases saines (à savoir : faire en sorte que ton projet compile avec cmake, puis créer dans ton IDE un projet basé sur cmake). Cela est supposé résoudre tous tes problèmes (car au pire du pire tu peux compiler en ligne de commandes). En effet, cmake permet de tout spécifier (compilateur, inclusion des headers, librairies externes, etc).
Si tu optes pour cette méthode, tu peux te baser sur ce tutoriel. Pour installer les paquets concernés sous Debian (ou une distribution qui en dérive) :
sudo apt update sudo apt install cmake cmake-gui-qt
Bonne chance
Merci pour les explications, @mamiemando. Sur mon PC, j'ai installé la distribution "Linux pop-os 6.2.6". Avant d'installer la librairie, j'ai installé les compilateurs C++ avec :
sudo apt install gcc g++ clang gdb
Puis dans Visual Studio Code, j'ai ajouté C/C++ intellisense. Pour la librairie SFML, j'utilise pour l'installer la commande :
sudo apt-get install libsfml-dev
Dans le fichier propriété ".json", j'ai remarqué que le compilateur actif est "gcc"; j'ai essayé de le changer pour "g++" pour voir si le problème est réglé, mais ce n'est pas le cas.
J'ai importé plus bas une capture d'écran de la configuration pour montrer ce que je dis. Sinon, y a-t-il moyen de lier mon programme avec les librairies sans passer par les lignes des commandes?
27 avril 2023 à 19:10
Merci d'avoir pris du temps de répondre, @mamiemando StatutModérateur.
Modifié le 28 avril 2023 à 15:05
De rien :-)
J'ai importé plus bas une capture d'écran de la configuration pour montrer ce que je dis. Sinon, y a-t-il moyen de lier mon programme avec les librairies sans passer par les lignes des commandes?
En théorie, ton IDE est supposé pouvoir te permettre de compiler à l'aide de cmake sans avoir à taper par toi-même les commande que cela induit. Je suppose que, comme le sujet a été basculé en résolu, tu y es parvenu ?