Mis inicios en C

Algoritmos, estructuras de datos, estrategias o patterns. Lenguaje' de programasión, vieja! Ce, loco, Ce! Páison, y todo eso.

Mis inicios en C

Notapor danhorris el Sab Feb 03, 2007 10:42 am

Buenas Gente!:

Me baje e instale una librería para C (GNU mailutils), mediante Synaptic.
Las incluyo en el fuente mediante el comando #include, me lo reconoce, pero cuando compilo el programa se me queda en la primera línea en la que utilizo una función de las librerias instaladas.

El error me dice: referencia a 'funcion..' sin definir.

Con solo bajarme la librería alcanza? o tengo que hacer algo más (compilar)? A qué puede deberse el error?

saludos

EDIT: El error dice que no está definido, es decir, no implementado?. En los .h veo que están solo los encabezados.
Donde están las implementaciones?...por ejemplo en la stdio.h está en encabezado para el "printf" pero no la implementación, cómo es que lo estoy usando?
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Mis inicios en C

Sponsor

Sponsor
 

Re: Mis inicios en C

Notapor Adriano el Sab Feb 03, 2007 11:47 am

Si no son librerías ya definidas, tenés que linkearlas al compilar. Por ejemplo, si en el programa <include>íste la librería math.h al compilar tenés que agregar -lmath al comando de compilación.
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Mis inicios en C

Notapor Adriano el Sab Feb 03, 2007 11:50 am

Por lo de "cómo es que estoy usando las funciones, si en el .h no aparece más que la definición?":
En las librerías o programas en C típicamente tenés tres archivos (mínimo):
  • Un archivo en que definís las funciones y variables globales, digamos milib.c
  • Un archivo en que declarás las funciones, por ej. milib.h
  • Un archivo en que usás las funciones declaradas en milib.h, por ej. main.c
El truco es que tanto milib.c como main.c incluyen milib.h, y al compilar y linkear el programa, el compilador resuelve los nombres de función como corresponde (si está todo bien).
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Mis inicios en C

Notapor danhorris el Sab Feb 03, 2007 12:55 pm

Ok. Pero por ejemplo el printf está declarado en stdio.h y definido entonces en stdio.c en este archivo estaría el linkeo que decís para que yo utilice el printf en el main.

Pero por ejemplo no encuentro donde está el "stdio.c"...

En mi caso me bajé la GNU mailutils, para utilizar ciertas funciones para el manejo de mails, me pasa que quiero usar una función y me dice que no está definida (esta el #include mailutils/message.h en donde está declarada la funcion) pero como en el caso anterior no encuentro donde están definidas las funciones, el caso del printf funciona pero en mi caso nop.

Al poner -lmessage me dice que no se pudo encontrar -lmessage
collect2: ld devolvió el estado de salida 1

Supongo que al bajar una librería como esta no bajo solo las declaraciones, donde quedaron definidas las funciones y cómo las uso?
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Re: Mis inicios en C

Notapor Adriano el Sab Feb 03, 2007 1:26 pm

Como había dicho, "Si no son librerías ya definidas". Stdio es una librería incluída en la libc (supongo), por lo cual el compilador ya sabe dónde encontrarlas. Hay que decir que, una vez compiladas, lo que vas a ver son librerías con extensión .o, .so o .a, no .c.
En tu caso específico, no recuerdo -si alguna vez supe- cómo llamar a librerías instaladas en subdirectorios (en tu caso, mailutils/), posiblemente el README o la documentación del paquete diga algo.
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

Re: Mis inicios en C

Notapor danhorris el Mie Feb 07, 2007 7:58 pm

El comando para linkear el paquete es -lmailutils.

El archivo de cabecera message.h está dentro de este paquete. El error que cometía era poner luego del -l el nombre del archivo de cabecera y no el del "paquete".
A partir de ahí compiló perfectamente.

saludos!
danhorris
 
Posts: 23
Registrado: Vie Ene 26, 2007 9:18 am

Re: Mis inicios en C

Notapor buanzo el Mie Feb 07, 2007 10:24 pm

Para clarificar aun mas:

La referencia a los .h las haces desde #includes de tu programa (sea .c o .h donde metas los includes... no viene al caso).

PERO si estas laburando contra headers de librerias de terceros (o sea, librerias que no son la "GNU C Library"), entonces simplemente agregas el -lnombre_de_lib. Si tuvieras que poner los .h en la linea de comandos del compilador, seria redundante... porque ya lo estas incluyendo desde el codigo fuente.

Saludos!
Avatarde Usuario
buanzo
Administrador
 
Posts: 673
Registrado: Sab Dic 09, 2006 11:17 am
Ubicación: Buanzonia (ok, Florida, Buenos Aires)


Volver a Programación y Diseño de Sófwer.

¿Quién está conectado...?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron