Su compilador acaba de intentar compilar el archivo llamado foo.cc. Al presionar el número de línea line, 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 archivo barestá en una carpeta con el nombre frobnicate, relativo a foo.cc(suponga que está compilando desde el directorio donde foo.ccse 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 /Ique 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 baren diferentes carpetas, dado:
#include<string>
std::string which() { return "A/bar"; }
#include<string>
std::string which() { return "B/bar"; }
#include<string>
std::string which() { return "C/bar"; }
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
La prioridad con #include "bar"es la más a la izquierda:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
Como se ve, cuando el compilador empezado a buscar a través A/, B/y C/, se detuvo en el primer o el golpe más a la izquierda.
Esto es cierto para ambas formas include <>y incude "".
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á #includeel archivo listen la carpeta de su proyecto, porque actualmente se compila main.ccy ese archivo está listen 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á #includeel archivo nombrado listque 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
Para los programas C ++, también buscará primero en / usr / include / c ++ / version. En lo anterior, target es el nombre canónico del sistema para el que GCC fue configurado para compilar código; [...].
La documentación también dice:
Puede agregar a esta lista con la opción de línea de comando -Idir. Todos los directorios nombrados por -I se buscan, en orden de izquierda a derecha, antes de los directorios predeterminados . La única excepción es cuando dir ya se busca de forma predeterminada. En este caso, la opción se ignora y el orden de búsqueda de los directorios del sistema permanece sin cambios.
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.