g++
gibt mir Fehler der Form:
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
Dies gilt auch für das Kompilieren von C-Programmen mit gcc
.
Warum ist das so?
Bitte beachten Sie: Diese Frage wurde schon oft gestellt, aber jedes Mal war sie spezifisch für die Situation des Fragestellers. Der Zweck dieser Frage ist es, eine Frage zu haben, die andere ein für alle Mal als Duplikate von schließen können. eine FAQ .
Antworten:
Ihr Compiler hat gerade versucht, die genannte Datei zu kompilieren
foo.cc
. Beim Erreichen der Zeilennummerline
findet der Compiler:#include "bar"
oder
#include <bar>
Der Compiler versucht dann, diese Datei zu finden. Zu diesem Zweck werden eine Reihe von Verzeichnissen zum Durchsuchen verwendet, in dieser Gruppe befindet sich jedoch keine Datei
bar
. Eine Erklärung des Unterschieds zwischen den Versionen der include-Anweisung finden Sie hier .Wie man dem Compiler sagt, wo er es findet
g++
hat eine Option-I
. Sie können der Befehlszeile Include-Suchpfade hinzufügen. Stellen Sie sich vor , dass Ihre Dateibar
in einem Ordner mit dem Namenfrobnicate
, bezogen auffoo.cc
(vorausgesetzt , dass Sie aus dem Verzeichnis kompilieren , wofoo.cc
befindet):g++ -Ifrobnicate foo.cc
Sie können weitere Include-Pfade hinzufügen. Jedes von Ihnen angegebene ist relativ zum aktuellen Verzeichnis. Der Compiler von Microsoft verfügt über eine Korrelationsoption
/I
, die auf die gleiche Weise funktioniert. In Visual Studio können die Ordner auf den Eigenschaftenseiten des Projekts unter Konfigurationseigenschaften-> C / C ++ -> Allgemein-> Zusätzliche Einschlussverzeichnisse festgelegt werden.Stellen Sie sich nun vor, Sie haben mehrere Versionen
bar
in verschiedenen Ordnern:// A/bar #include<string> std::string which() { return "A/bar"; }
// B/bar #include<string> std::string which() { return "B/bar"; }
// C/bar #include<string> std::string which() { return "C/bar"; }
// foo.cc #include "bar" #include <iostream> int main () { std::cout << which() << std::endl; }
Die Priorität mit
#include "bar"
ist ganz links:$ g++ -IA -IB -IC foo.cc $ ./a.out A/bar
Wie Sie sehen, wenn der Compiler gestartet Suche durch
A/
,B/
undC/
hielt es an dem ersten oder am weitesten links stehenden Hit.Dies gilt für beide Formen
include <>
undincude ""
.Unterschied zwischen
#include <bar>
und#include "bar"
Normalerweise
#include <xxx>
werden zuerst Systemordner und zuerst#include "xxx"
aktuelle oder benutzerdefinierte Ordner angezeigt.Z.B:
Stellen Sie sich vor, Sie haben die folgenden Dateien in Ihrem Projektordner:
list main.cc
mit
main.cc
:#include "list" ....
Zu diesem Zweck erstellt Ihr Compiler
#include
die Dateilist
in Ihrem Projektordner, da sie derzeit kompiliert wirdmain.cc
und sich diese Dateilist
im aktuellen Ordner befindet.Aber mit
main.cc
:#include <list> ....
Anschließend
g++ main.cc
überprüft Ihr Compiler zuerst die Systemordner. Da<list>
es sich um einen Standardheader handelt, wird#include
die Datei mit dem Namen verwendetlist
, die mit Ihrer C ++ - Plattform als Teil der Standardbibliothek geliefert wird.Dies ist alles etwas vereinfacht, sollte Ihnen aber die Grundidee geben.
Details zu
<>
/""
-priorities und-I
Laut der gcc-Dokumentation hat
include <>
auf einem "normalen Unix-System" folgende Priorität :/usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include
In der Dokumentation heißt es außerdem:
Um unser
#include<list> / #include"list"
Beispiel fortzusetzen (gleicher Code):g++ -I. main.cc
und
#include<list> int main () { std::list<int> l; }
In der Tat enthält die
-I.
Priorisierung des Ordners.
über das System und wir erhalten einen Compilerfehler.quelle
#include <>
sieht in den Verzeichnissen mit-I
vor Standard-Systemverzeichnissen aufgeführt-I
in dem Sie gcc ausführen, und nicht auf die zu kompilierende Datei. Der Unterschied ist signifikant, wenn Sie dies tung++ -Ifrobnicate blah/foo.cc
PATH
Beeinflussen die Einstellungen Ihrer Umgebungsvariablen (auf Linux-Systemen), wie der Compiler überhaupt nach Dateien sucht?das funktioniert bei mir, sudo apt-get install libx11-dev
quelle