Saltar al contenido

gcc/g++: “No existe tal archivo o directorio”

Ten en cuenta que en la informática cualquier problema casi siempere suele tener diferentes resoluciones, pero te enseñaremos lo más óptimo y mejor.

Solución:

Su compilador acaba de intentar compilar el archivo llamado foo.cc. Al golpear el número de línea lineel compilador encuentra:

#include "bar"

o

#include 

Luego, el compilador intenta encontrar ese archivo. Para esto, 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 incluir rutas de búsqueda a la línea de comando. Imagina que tu archivo bar está en una carpeta llamada frobnicaterelativo a foo.cc (suponga que está compilando desde el directorio donde foo.cc se encuentra):

g++ -Ifrobnicate foo.cc

Puede agregar más rutas de inclusión; cada uno que das 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 imagina que tienes varias versiones de bar en diferentes carpetas, dado:


// A/bar
#include
std::string which()  return "A/bar"; 

// B/bar
#include
std::string which()  return "B/bar"; 

// C/bar
#include
std::string which()  return "C/bar"; 

// foo.cc
#include "bar"
#include 

int main () 
    std::cout << which() << std::endl;


La prioridad con #include "bar" está más a la izquierda:

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

Como puede ver, cuando el compilador comenzó a revisar A/, B/ y C/se detuvo en el primer golpe o en el más a la izquierda.

Este es true de ambas formas, include <> y incude "".

Diferencia entre #include y #include "bar"

Por lo general, el #include hace que busque primero en las carpetas del sistema, el #include "xxx" hace que busque 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 #include el archivo list en la carpeta de su proyecto, porque actualmente compila main.cc y ahí está ese archivo list en la carpeta actual.

Pero con main.cc:

#include 
....

y luego g++ main.ccsu compilador buscará primero en las carpetas del sistema, y ​​debido a que es un encabezado estándar, lo hará #include el archivo llamado list que viene con su plataforma C++ como parte de la biblioteca estándar.

Todo esto está un poco simplificado, pero debería darle una idea básica.

Detalles sobre <>/""-prioridades y -I

De acuerdo con 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 se configuró GCC para compilar código; [...].

La documentación también establece:

Puede agregar a esta lista con la opción de línea de comando -Idir. Se buscan todos los directorios nombrados por -I, 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 nuestro #include / #include"list" ejemplo (mismo código):

g++ -I. main.cc

y

#include
int main ()  std::list l; 

y de hecho, el -I. prioriza la carpeta . sobre el sistema incluye y obtenemos un error de compilación.

Calificaciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *