gcc/g++: “No such file or directory”
g++
me donne des erreurs de la forme:
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
C'est la même chose lors de la compilation C-programmes avec gcc
.
Pourquoi est-ce?
Veuillez noter: Cette question a été posée de nombreuses fois avant, mais à chaque fois c'était spécifique à la askers situation. Cette question a pour but d'une question que d'autres peuvent être fermés comme des doublons de, une fois pour toutes; un FAQ.
- Belle addition à la FAQ. Grâce à vous!
Vous devez vous connecter pour publier un commentaire.
Votre compilateur juste essayé de compiler le fichier nommé
foo.cc
. Au moment de frapper le numéro de ligneline
, le compilateur trouve:ou
Le compilateur essaie de trouver ce fichier. Pour cela, il utilise un ensemble de répertoires regarder, mais à l'intérieur de cet ensemble, il n'existe pas de fichier
bar
. Pour une explication de la différence entre les versions de l'instruction include look ici.Comment indiquer au compilateur où trouver
g++
a une option-I
. Il vous permet d'ajouter inclure les chemins de recherche de la ligne de commande. Imaginez que votre fichierbar
est dans un dossier nomméfrobnicate
, par rapport àfoo.cc
(à supposer que vous compilez à partir du répertoire oùfoo.cc
est situé):Vous pouvez ajouter plus d'inclure des chemins d'accès; chaque vous donner est relatif au répertoire courant. Microsoft compilateur a une corrélation option
/I
qui fonctionne de la même façon, ou dans Visual Studio, les dossiers peuvent être définis dans les Pages de propriétés du Projet, en vertu des Propriétés de Configuration->C/C++->Général>d'autres Répertoires include.Maintenant, imaginez que vous avez plusieurs version de
bar
dans des dossiers différents, compte tenu de:La priorité à
#include "bar"
est le plus à gauche:Comme vous le voyez, lorsque le compilateur commencé à regarder dans
A/
,B/
etC/
, elle s'est arrêtée à la première ou la plus à gauche frappé.Cela est vrai des deux formes,
include <>
etincude ""
.Différence entre
#include <bar>
et#include "bar"
Généralement, la
#include <xxx>
il fait regarder dans les dossiers système tout d'abord, le#include "xxx"
fait paraître dans le courant ou des dossiers personnalisés en premier.E. g.:
Imagine que vous devez avoir les fichiers suivants dans le dossier de votre projet:
avec
main.cc
:Pour cela, votre compilateur
#include
le fichierlist
dans le dossier de votre projet, car il compile actuellementmain.cc
et il y a un fichierlist
dans le dossier en cours.Mais avec
main.cc
:et puis
g++ main.cc
, votre compilateur va chercher dans les dossiers système tout d'abord, et parce que<list>
est un en-tête standard, il#include
le fichier nommélist
qui vient avec votre C++ plate-forme en tant que partie de la bibliothèque standard.C'est un peu simplifié, mais devrait vous donner l'idée de base.
Détails sur
<>
/""
-priorités et-I
Selon la gcc-documentation, la priorité pour
include <>
est, sur un "normal système Unix"), comme suit:La documentation indique également:
Pour continuer notre
#include<list> /#include"list"
exemple (même code):et
et en effet, le
-I.
donne la priorité le dossier.
sur le système comprend et on obtient une erreur de compilation.#include <>
recherche dans les répertoires listés avec-I
avant la défaillance du système dirs-I
sont relatifs au répertoire où vous exécutez gcc, pas par rapport au fichier en cours de compilation. La différence est significative si vous neg++ -Ifrobnicate blah/foo.cc
-I
/<>
-test à tort.PATH
variable d'environnement (sur les systèmes Linux) affectent la façon dont le compilateur recherche des fichiers à tous?