Discussion:
undefined reference to 'nombre función'
(demasiado antiguo para responder)
Alias
2009-08-12 12:17:32 UTC
Permalink
Hola, estoy intentando hacer una prueba mínima con gtk, pero no puedo
compilar, los archivos actualmente han dejenerado en esto y ni así:

+ aplicacion.c:
#include <gui.h>


int main (int argc, char* argv[])
{
int valor;
valor = inicializar();

return valor;
}

hay una carpeta que contiene 2 archivos (cabecera y código)

+ interfaz/gui.h:
int inicializar (void);

+ interfaz/gui.c:
#include <gui.h>

int inicializar (void)
{
return 0;
}


Compilo con: gcc -I`pwd`/interfaz -g -v -Wall -o aplicacion
aplicacion.c
y me da el error: undefined reference to `inicializar'

3 cosillas:
También he probado con gui.h y gui.c en la misma carpeta que
aplicacion.c, el error es el mismo.
Introduje errores en gui.c y no los "canta" así que a gui.c ni entra.
El archivo gui.c si lo encuentra porque anteriormente escribia mal la
ruta y me decía:
gui.h: No existe el fichero ó directorio


Esta es toda la salida:

Usando especificaciones internas.
Objetivo: i486-linux-gnu
Configurado con: ../src/configure -v --with-pkgversion='Ubuntu
4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/
README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/
usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-
included-gettext --enable-threads=posix --enable-nls --with-gxx-
include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-
clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --
enable-targets=all --with-tune=generic --enable-checking=release --
build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Modelo de hilos: posix
gcc versión 4.3.3 (Ubuntu 4.3.3-5ubuntu4)
COLLECT_GCC_OPTIONS='-I/home/javier/proyecto/interfaz' '-g' '-v' '-
Wall' '-o' 'aplicacion' '-mtune=generic'
/usr/lib/gcc/i486-linux-gnu/4.3.3/cc1 -quiet -v -I/home/javier/
proyecto/interfaz aplicacion.c -D_FORTIFY_SOURCE=2 -quiet -dumpbase
aplicacion.c -mtune=generic -auxbase aplicacion -g -Wall -version -
fstack-protector -o /tmp/cca6Hujl.s
se descarta el directorio inexistente "/usr/local/include/i486-linux-
gnu"
se descarta el directorio inexistente "/usr/lib/gcc/i486-linux-gnu/
4.3.3/../../../../i486-linux-gnu/include"
se descarta el directorio inexistente "/usr/include/i486-linux-gnu"
la búsqueda de #include "..." inicia aquí:
la búsqueda de #include <...> inicia aquí:
/home/javier/proyecto/interfaz
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.3.3/include
/usr/lib/gcc/i486-linux-gnu/4.3.3/include-fixed
/usr/include
Fin de la lista de búsqueda.
GNU C (Ubuntu 4.3.3-5ubuntu4) versión 4.3.3 (i486-linux-gnu)
compilado por GNU C versión 4.3.3, GMP versión 4.2.4, MPFR versión
2.4.0.
GGC heurísticas: --param ggc-min-expand=97 --param ggc-min-
heapsize=126295
Compiler executable checksum: 0bf5703b57e064ca90b48f4e2c186f4a
COLLECT_GCC_OPTIONS='-I/home/javier/proyecto/interfaz' '-g' '-v' '-
Wall' '-o' 'aplicacion' '-mtune=generic'
as -V -Qy -o /tmp/ccoZuxIx.o /tmp/cca6Hujl.s
GNU assembler version 2.19.1 (i486-linux-gnu) using BFD version (GNU
Binutils for Ubuntu) 2.19.1
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-
linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-
gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/
4.3.3/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.3.3/:/usr/lib/gcc/i486-
linux-gnu/4.3.3/:/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/:/
lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/
4.3.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-I/home/javier/proyecto/interfaz' '-g' '-v' '-
Wall' '-o' 'aplicacion' '-mtune=generic'
/usr/lib/gcc/i486-linux-gnu/4.3.3/collect2 --eh-frame-hdr -m elf_i386
--hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o aplicacion -z
relro /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o /usr/
lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o /usr/lib/gcc/i486-
linux-gnu/4.3.3/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.3.3 -L/usr/
lib/gcc/i486-linux-gnu/4.3.3 -L/usr/lib/gcc/i486-linux-gnu/
4.3.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/
i486-linux-gnu/4.3.3/../../.. /tmp/ccoZuxIx.o -lgcc --as-needed -
lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /
usr/lib/gcc/i486-linux-gnu/4.3.3/crtend.o /usr/lib/gcc/i486-linux-gnu/
4.3.3/../../../../lib/crtn.o
/tmp/ccoZuxIx.o: In function `main':
/home/javier/proyecto/aplicacion.c:7: undefined reference to
`inicializar'
collect2: ld devolvió el estado de salida 1
Alias
2009-08-12 12:19:00 UTC
Permalink
(Se envió antes de tiempo jeje perdonad)

¿Alguien tiene alguna idea? cualquier posibilidad es bien recibida.

Gracias de antemano.
Alias
2009-08-12 13:26:13 UTC
Permalink
Vale, estaba compilando malllllllllllllllllllllllll, pffff que
despiste.

Gracias de todas formas ;)
Pedro Maicas
2009-08-13 06:53:34 UTC
Permalink
Post by Alias
Vale, estaba compilando malllllllllllllllllllllllll, pffff que
despiste.
¿ compilando mal ? No se a qué te refieres, pero
por lo que has puesto en el primer mensaje, estabas llamando a
una funcion (inicializar) que no estaba definida, de ahí el
mensaje de error que te daba (que lo decía bien claro).

Es decir, cuando en el primer fichero invocas una
funcion que aparece posteriormente en otro fichero, el compilador
no sabe donde está (ni si está) esa funcion. Siempre declara
las funciones antes de usarlas.


Saludos :-) -Pedro-

http://www.maicas.net/

e-mail en www.maicas.net
angel
2009-08-13 13:55:41 UTC
Permalink
Post by Pedro Maicas
Es decir, cuando en el primer fichero invocas una
funcion que aparece posteriormente en otro fichero, el compilador
no sabe donde está (ni si está) esa funcion. Siempre declara
las funciones antes de usarlas.
¿Entonces no basta con el "#include <gui.h>" en el archivo "aplicacion.c"?
Ahí la declara, ¿ no ?.

Quizá es que el compilador no encuentra "gui.h".
Si "gui.h" está en el mismo directorio de "aplicacion.c" debería escrivir el
include así: #include "gui.h"
y si está en otro, así: #include "/path/al/archivo/gui.h"

Tal como está escrito ahora solo será encontrado si está en el paht de los
includes.
Otra opción sería indicar al compilador el camino a los archivos cabecera,
creo que con la opció "-I /camino/a/los/*.h".

Por favor. Corregidme si me equivoco que siempre me lio con esto.
Gonzalo Pérez de Olaguer Córdoba
2009-08-13 14:13:33 UTC
Permalink
Post by angel
Post by Pedro Maicas
Es decir, cuando en el primer fichero invocas una
funcion que aparece posteriormente en otro fichero, el compilador
no sabe donde está (ni si está) esa funcion. Siempre declara
las funciones antes de usarlas.
¿Entonces no basta con el "#include <gui.h>" en el archivo "aplicacion.c"?
Ahí la declara, ¿ no ?.
Sí basta, siempre que al compilador le indiques que busque en el directorio
donde se encuentra gui.h (en este caso -I`pwd`/interfaz), cosa que ha hecho.
Post by angel
Quizá es que el compilador no encuentra "gui.h".
Sí que lo encuentra.
Post by angel
Si "gui.h" está en el mismo directorio de "aplicacion.c" debería escrivir el
include así: #include "gui.h"
y si está en otro, así: #include "/path/al/archivo/gui.h"
Correcto.
Post by angel
Tal como está escrito ahora solo será encontrado si está en el paht de los
includes.
Otra opción sería indicar al compilador el camino a los archivos cabecera,
creo que con la opció "-I /camino/a/los/*.h".
Eso es lo que ha hecho.
Post by angel
Por favor. Corregidme si me equivoco que siempre me lio con esto.
Lo que dices es correcto. Puede que me equivoque, pero creo que los includes
eran correctos, y de hecho la compilación funcionaba bien.

Lo que le estaba fallando era la operación de enlace del "linkador". El error
se lo estaba dando a la hora de enlazar, porque no había incluido gui.o para
enlazar junto a aplicaction.o

Sin mirar mas detenidamente, creo que eso es lo que le pasaba.
--
Gonzalo Pérez de Olaguer Córdoba <***@iies.es> --- www.gpoc.es
PGP key 2861C704 --- F206 5671 6789 425D 111C 1302 214F 1934 2861 C704
angel
2009-08-13 14:42:56 UTC
Permalink
Post by Gonzalo Pérez de Olaguer Córdoba
Sí basta, siempre que al compilador le indiques que busque en el
directorio donde se encuentra gui.h (en este caso -I`pwd`/interfaz), cosa
que ha hecho.
Vale.
He mirado más detenidamente.
En mi lector de news veo "I" (i mayúscula) como "l" (ele minúscula). De ahí
la confusión.
Tal como compila Alias, la función está declarada pero no definida. (lo
acavo de mirar en mi libro de C :-) )

Saludos.

Loading...