g++
me da errores de la forma:
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
Es lo mismo al compilar programas C con gcc
.
¿Porqué es eso?
Tenga en cuenta: esta pregunta se ha hecho muchas veces antes, pero cada vez fue específica para la situación de los solicitantes. El propósito de esta pregunta es tener una pregunta que otras puedan cerrarse como duplicados , de una vez por todas; una pregunta frecuente .
Respuestas:
Su compilador acaba de intentar compilar el archivo llamado
foo.cc
. Al presionar el número de línealine
, el compilador encuentra:#include "bar"
o
#include <bar>
Luego, el compilador intenta encontrar ese archivo. Para ello, utiliza un conjunto de directorios para buscar, pero dentro de este conjunto, no hay ningún archivo
bar
. Para obtener una explicación de la diferencia entre las versiones de la declaración de inclusión, consulte aquí .Cómo decirle al compilador dónde encontrarlo
g++
tiene una opción-I
. Le permite agregar rutas de búsqueda de inclusión a la línea de comandos. Imagine que su archivobar
está en una carpeta con el nombrefrobnicate
, relativo afoo.cc
(suponga que está compilando desde el directorio dondefoo.cc
se encuentra):g++ -Ifrobnicate foo.cc
Puede agregar más rutas de inclusión; cada uno que da es relativo al directorio actual. El compilador de Microsoft tiene una opción de correlación
/I
que funciona de la misma manera, o en Visual Studio, las carpetas se pueden configurar en las Páginas de propiedades del Proyecto, en Propiedades de configuración-> C / C ++ -> General-> Directorios de inclusión adicionales.Ahora imagine que tiene varias versiones de
bar
en diferentes carpetas, dado:// 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; }
La prioridad con
#include "bar"
es la más a la izquierda:Como se ve, cuando el compilador empezado a buscar a través
A/
,B/
yC/
, se detuvo en el primer o el golpe más a la izquierda.Esto es cierto para ambas formas
include <>
yincude ""
.Diferencia entre
#include <bar>
y#include "bar"
Por lo general, lo
#include <xxx>
hace buscar primero en las carpetas del sistema, luego lo#include "xxx"
hace buscar primero en las carpetas actuales o personalizadas.P.ej:
Imagina que tienes los siguientes archivos en la carpeta de tu proyecto:
list main.cc
con
main.cc
:#include "list" ....
Para esto, su compilador guardará
#include
el archivolist
en la carpeta de su proyecto, porque actualmente se compilamain.cc
y ese archivo estálist
en la carpeta actual.Pero con
main.cc
:#include <list> ....
y luego
g++ main.cc
, su compilador buscará primero en las carpetas del sistema, y debido a que<list>
es un encabezado estándar, será#include
el archivo nombradolist
que viene con su plataforma C ++ como parte de la biblioteca estándar.Todo esto está un poco simplificado, pero debería darte una idea básica.
Detalles sobre
<>
/""
-priorities y-I
Según la documentación de gcc , la prioridad para
include <>
es, en un "sistema Unix normal", como sigue:/usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include
La documentación también dice:
Para continuar con nuestro
#include<list> / #include"list"
ejemplo (mismo código):g++ -I. main.cc
y
#include<list> int main () { std::list<int> l; }
y de hecho,
-I.
prioriza la carpeta.
sobre el sistema que incluye y obtenemos un error del compilador.fuente
#include <>
ve en los directorios enumerados-I
antes de los directorios predeterminados del sistema-I
son relativos al directorio donde ejecuta gcc, no al archivo que se está compilando. La diferencia es significativa si lo haceg++ -Ifrobnicate blah/foo.cc
PATH
variable de entorno (en sistemas Linux) afecta la forma en que el compilador busca archivos?