Errores de Compilacion GCC
Errores de Compilacion GCC
Errores de Compilacion GCC
Paco Abad
22 de octubre de 2002
Índice
1. Introducción 2
4. Más información... 8
1
1. Introducción
El compilador gcc puede producir dos tipos de mensajes: errores y avisos (warning). Cada tipo
tiene un propósito distinto:
Errores: Informan de problemas que hacen imposible compilar el programa. gcc indica
dónde esta el error mediante el nombre del fichero y el número de lı́nea donde cree que
puede estar el problema.
Avisos: Indican un problema, aunque la compilación continúa. Los mensajes de aviso tam-
bién indican el fichero y el número de lı́nea, pero incluyen el texto warning para distinguirlos
de los mensajes de error.
Los avisos pueden indicar puntos de peligro que se deberı́an comprobar para asegurarse que el
programa realmente hace lo que debe. Muchos avisos sólo se generan si se incluye la opción -Wall.
Por ello, se aconseja utilizar el siguiente formato para compilar programas con gcc:
Los avisos no se deberı́an ignorar, porque normalmente indican que hay algo mal en el progra-
ma, y seguramente se comportará de forma diferente a la esperada. Hay otra opción de compilación
que comprueba si se están utilizando variables sin inicializar. Dicha opción se activa con la opción
-O.
Los mensajes de error y los avisos aparecen precedidos por el nombre del fichero y la función
donde se ha encontrado el error. Por ejemplo:
indica que el error está en el fichero prog.c, y especı́ficamente en la función main. Las siguientes
lı́neas indican los errores que ha encontrado dentro de dicha función. Si el programa tiene más de
una función o más de un fichero, entonces los errores de cada función y fichero aparecerán listados
separadamente. Las lı́neas de error o aviso que siguen la lı́nea anterior indican el lugar aproximado
donde se ha producido el error (en ocasiones el compilador no es capaz de encontrar exactamente
la lı́nea errónea). El formato con el que aparecen es el nombre del fichero, seguido por la lı́nea
dentro de ese fichero, la palabra warning (si es un aviso) y una descripción del problema. Por
ejemplo:
indica que hay un problema en la lı́nea 3 del fichero prog.c. El mensaje es un aviso. El pro-
blema encontrado es que el carácter \z no es una secuencia de escape conocida. Si no hay más
errores, el compilador generará el programa, y se podrá ejecutar, pero seguramente tendrá un
comportamiento extraño.
A continuación aparece otro ejemplo de salida de errores:
2
En este caso, los errores se reparten entre la función factorialI (1 error), combina (2 errores)
y main (1 error).
Ten en cuenta que, en la mayorı́a de las ocasiones, un error puede inducir otros muchos. A
la hora de depurar los errores de un programa, empieza siempre por el primero, y recompila a
menudo, ya que los demás pueden desaparecer en cascada.
A continuación se muestra una lista de los errores y avisos más comunes del compilador gcc,
junto a una pequeña descripción del error. Si encuentras un error no listado en este documento,
por favor mándamelo para añadirlo (fjabad@dsic.upv.es).
que indica que, aunque la variable que no se ha declarado se utilice varias veces en la función, sólo
se informará de la primera aparición.
gcc prog
gcc -o prog.c prog
gcc prog -o prog.c
Este error puede ir acompañado del mensaje No input files. En alguno de los ejemplos
anteriores, puede ocurrir que el compilador borre el fichero fuente, perdiendo el programa tecleado.
El comando correcto serı́a:
main() {
into printf("Hola, mundo\n");
}
3
falta un paréntesis ’)’ o una llave de cierre ’}’ en los alrededores de la lı́nea indicada
hay más llaves de la cuenta
falta un punto y coma (;) en la lı́nea anterior
hay una expresión mal construida
gcc ha encontrado lo que parece una llamada a una función, pero no encuentra el código de
dicha función. El nombre de la función desaparecida es la última palabra de la segunda lı́nea (en el
ejemplo anterior, juan). En el caso de que la función que falta sea la función main, se obtendrá un
error como:
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o: In function ‘_start’:
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o(.text+0x18): undefined reference to ‘main’
collect2: ld returned 1 exit status
Todos los programas C deben definir una función main, porque es la función que se invoca al
ejecutar el programa.
Estos errores aparecen principalmente debido a:
Errores tipográficos. Se ha escrito mal el nombre de la función (¡cuidado con las mayúsculas!)
La función está en otro fichero. En ese caso, la orden para compilar es:
Si la función que falta es de la librerı́a matemática (sqrt, sin, tan. . . ), el error indica que no
se ha enlazado la librerı́a matemática. Para ello, compilar con la opción -lm:
4
2.7. unterminated string or character constant
Hay una cadena que abre comillas, pero no las cierra. Normalmente la lı́nea indicada no es la
que contiene el fallo. Hay que comprobar desde la lı́nea de error hacia atrás que todas las cadenas
tienen las comillas de apertura y de cierre. Por ejemplo, en la lı́nea siguiente faltan las comillas de
cierre:
Error tipográfico
Se quiere mostrar el carácter ’\’ por pantalla. En ese caso, utilizar ’\\’.
3.3. passing arg n of ‘función’ makes pointer from integer without a cast
En la llamada a la función cuyo nombre indica el mensaje de error, el argumento n-ésimo se
esperaba que fuera un puntero, pero se le ha pasado un entero sin convertir su tipo explı́citamente.
C es un lenguaje tipado, ası́ que el tipo de los datos que se pasan a una función y el tipo
declarado de los argumentos deben coincidir. Este aviso se recibe siempre que se da una incompa-
tibilidad de tipos entre los datos que se pasan a una función y el tipo que se espera. Este aviso no
5
se debe ignorar, ya que normalmente indica un error de tipo lógico. El siguiente programa genera
este aviso:
#include <stdio.h>
int main() {
int b=10;
b=suma(b);
return 0;
}
La causa más común de aparición de este error es que se está pasando una variable de tipo
int, pero se espera una variable de tipo int *. Para solucionarlo, hay que utilizar el operador &
para obtener el puntero correspondiente. Para el ejemplo anterior:
b=suma(&b);
Si, por ejemplo, se utilizan las rutinas matemáticas sin incluir la cabecera math.h, puede ocurrir
que rutinas como sin, cos, sqrt, etc. devuelvan valores extraños. Esto es debido a que el com-
pilador asume por defecto que las funciones que no conoce devuelven un entero. Posteriormente,
si la función devolvı́a otro tipo de datos (por ejemplo, float), entonces el programa fallará. La
solución es incluir las cabeceras necesarias.
if (i = 1009)
printf("Esto se imprime siempre!!!\n");
En C, el signo ’=’ indica asignación. Por lo tanto, la lı́nea anterior asigna el valor 1009 a la
variable i. Según las reglas de C, el resultado de hacer una asignación es el valor de la parte
derecha. Por lo tanto, el resultado de i = 1009 es 1009 que, como es distinto de cero, se considera
verdadero y el if siempre se cumple. Si se querı́a utilizar el operador de comparación, cambiar el
= por ==.
6
3.6. format argument is not a pointer (arg n)
En una llamada a scanf, no se ha pasado el puntero a la variable donde almacenar el valor
introducido por el usuario. Por ejemplo, el siguiente programa es incorrecto:
int b=10;
scanf("%d",b);
Si se ignora el aviso y se ejecuta el programa resultante, seguramente al pasar por esa lı́nea el
programa provocará una excepción y acabará.
Para solucionarlo, a scanf siempre hay que pasar la dirección de la variable que debe recoger
el valor:
scanf("%d",&b);
[...]
return 0;
}
El valor que devuelve la función main es el valor que se pasa al sistema operativo como código
de error. Un programa que termina normalmente debe devolver un cero. Cuando un programa
devuelve un número distinto de cero indica que no se ha podido completar la ejecución debido a
un error (por ejemplo, porque no ha encontrado un fichero).
7
4. Más información...
En las siguientes páginas web puedes obtener más información sobre los errores producidos por
gcc:
http://www.cs.um.edu.mt/~cstaff/courses/lectures/csa2170/c_errors.html
http://cs-www.bu.edu/help/unix/the_four_most_common_gcc_error_messages.html
http://web.cs.mun.ca/~michael/c/problems.html