GCC / G ++: “Geen bestand of map”

g++geeft me fouten van het formulier:

foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.

Het is hetzelfde bij het samenstellen van C-programma’s met gcc.

Waarom is dat?


Let op: Deze vraag is vele malen eerder gevraagd, maar elke keer was het specifiek voor de situatie van de vraag. Het doel van deze vraag is om een ​​vraag te hebben die anderen kunnen worden gesloten als duplicaten van , voor eens en voor altijd; A FAQ .


Antwoord 1, Autoriteit 100%

Uw compiler heeft geprobeerd het bestand te compileren met de naam foo.cc. Bij het raken van lijnnummer line, vindt de compiler:

#include "bar"

of

#include <bar>

De compiler probeert vervolgens dat bestand te vinden. Hiervoor gebruikt het een reeks mappen om naar te kijken, maar binnen deze set is er geen bestand bar. Voor een verklaring van het verschil tussen de versies van de COMPLETING Look hier .

Hoe de compiler te vertellen waar u het vindt

g++heeft een optie -I. Hiermee kunt u toevoegen een zoekpaden op de opdrachtregel opnemen. Stel je voor dat je bestand barstaat in een map met de naam frobnicate, ten opzichte van foo.cc(aannemen dat u in de map bent waar foo.ccbevindt zich):

g++ -Ifrobnicate foo.cc

Je kunt meer include-paths toevoegen; elke die u geeft is relatief ten opzichte van de huidige map. De compiler van Microsoft heeft een correlatieoptie /Idie op dezelfde manier werkt, of in Visual Studio, de mappen kunnen worden ingesteld in de eigenschappenpagina’s van het project, onder Configuratie-eigenschappen->C/C++- >Algemeen->Aanvullende mappen opnemen.

Stel je nu voor dat je meerdere versies van barin verschillende mappen hebt, gegeven:


// 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;
}

De prioriteit met #include "bar"is uiterst links:

$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar

Zoals je ziet, toen de compiler begon te zoeken door A/, B/en C/, stopte het bij de eerste of meest linkse raak.

Dit geldt voor beide vormen, include <>en incude "".

Verschil tussen #include <bar>en #include "bar"

Meestal laat de #include <xxx>het eerst in systeemmappen kijken, de #include "xxx"laat het eerst in de huidige of aangepaste mappen kijken .

Bijvoorbeeld:

Stel je voor dat je de volgende bestanden in je projectmap hebt:

list
main.cc

met main.cc:

#include "list"
....

Hiervoor zal uw compiler #includehet bestand listin uw projectmap plaatsen, omdat het momenteel main.cccompileert en er is dat bestand listin de huidige map.

Maar met main.cc:

#include <list>
....

en dan g++ main.cc, zal uw compiler eerst in de systeemmappen kijken, en omdat <list>een standaard header is, zal het #includehet bestand met de naam listdat bij uw C++-platform wordt geleverd als onderdeel van de standaardbibliotheek.

Dit is allemaal een beetje vereenvoudigd, maar zou je het basisidee moeten geven.

Details over <>/""-prioriteiten en -I

Volgens de gcc-documentatieis de prioriteit voor include <>is, op een “normaal Unix-systeem”, als volgt:

/usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

Voor C++-programma’s zal het eerst ook in /usr/include/c++/version kijken. In het bovenstaande is doel de canonieke naam van het systeem waarvoor GCC is geconfigureerd om code voor te compileren; […].

In de documentatie staat ook:

U kunt aan deze lijst toevoegen met de -Idir opdrachtregeloptie. Alle mappen genoemd door -I worden doorzocht, van links naar rechts, vóór de standaardmappen. De enige uitzondering is wanneer dir standaard al wordt doorzocht. In dit geval wordt de optie genegeerd en blijft de zoekvolgorde voor systeemdirectory’s ongewijzigd.

Om door te gaan met onze #include<list> / #include"list"voorbeeld (dezelfde code):

g++ -I. main.cc

en

#include<list>
int main () { std::list<int> l; }

en inderdaad, de -I.geeft prioriteit aan de map .boven het systeem omvat en we krijgen een compilerfout.


Antwoord 2

dit werkt voor mij, sudo apt-get install libx11-dev

Other episodes