Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con compilacion en UNIX

Estas en el tema de Ayuda con compilacion en UNIX en el foro de C/C++ en Foros del Web. Estoy intentando compliar un programa en c desde unix, pero no tengo mucha idea, y me esta dando problemas. Para empezar, compile el tipico programa ...
  #1 (permalink)  
Antiguo 10/05/2006, 03:48
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Ayuda con compilacion en UNIX

Estoy intentando compliar un programa en c desde unix, pero no tengo mucha idea, y me esta dando problemas.

Para empezar, compile el tipico programa "hola mundo" para probar, jeje, y todo bien. Use gcc con la opcion -o para darle nombre, y perfecto.

gcc holamundo.c -o holamundo

Ahora, con un programa de verdad :p que tiene varios #includes, estos concretamente:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "gd.h"

usando gcc igual que con la primera prueba me salen los siguentes errores, todos parecidos a este:

/tmp/cc006t47.o(.text+0x51): En la funcion 'main':
:undefined reference to 'gdImageCreateFromJpeg'

la variacion de cada error esta basicamente en la funcion que lo da (gdImageCreateFromJpeg es una funcion de gd.h), tales como round, floor, ceil (funciones de math si no me equivoco), y alguna que otra mas de gd.h


Puedo imaginar que no encuentra la ruta a los archivos de los includes, como podria especificarselo? gracias
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #2 (permalink)  
Antiguo 10/05/2006, 10:32
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
OK, el problema es que tal vez no tengas el fichero gd.h, el cual tiene definida ciertas variables y funciones.
revisa tus ficheros fuente y asegurate.
  #3 (permalink)  
Antiguo 10/05/2006, 11:50
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
gd.h debe estar en el mismo sitio que main.h ya que lo tienes entre comillas. Aparte de gd.h debe haber un archivo que contenga las funciones en caso de que haya, un .a o tal vez otro aprchivo cpp.
Porque no nos explicas que es gd?

Saludos
  #4 (permalink)  
Antiguo 11/05/2006, 01:28
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Pues tengo en una carpeta los dos archivos, el .c y gd.h, desde el principio, asi que no se... jeje

gd.h es una libreria para tratamiento de imagenes y tal http://www.boutell.com/gd/
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #5 (permalink)  
Antiguo 11/05/2006, 19:05
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
Pues pon el gd.c junto al gd.h asi se compilaran juntos y no te dara errores de link.
Saludos
  #6 (permalink)  
Antiguo 12/05/2006, 01:30
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
que gd.c??

Los archivos que tengo son el "main.c" con el programa en si, y la libreria "gd.h", que contiene funciones que uso en main.c

Os aseguro que los dos archivos estan en la misma carpeta desde el principio, y me ha estado dando el error que os comente en el primer post

Gracias por las respuestas!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #7 (permalink)  
Antiguo 12/05/2006, 13:11
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
Bueno, por lo general cada .h tiene una de dos, o el .c(.cpp) o una libreria precompilada(dll, lib, etc). Entonces, si por ejemplo es un .c(.cpp) solo pones el archivo junto a la cabecera y listo, pero si es una librearia precompilada, tienes que inlcuir el archivo .lib o .a para que asi se una a tu programa, y el .h solo sea elemento de comunicacion.
Si tu mismo hisiste el gd.h, entonces necesitariamos ver tu gd.h

Saludos
  #8 (permalink)  
Antiguo 14/05/2006, 11:06
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
No, el gd.h no lo he hecho yo... forma parte de una libreria grafica! que me baje de aqui

http://www.boutell.com/gd

Por cierto, en el servidor que utilizo, he descubuierto que estas librerias ya estaban correctamente compiladas, en el sitio que tenian que estar, jeje en /usr/include (linux)

Como es posible que me de ese error? que puedo hacer para solucionarlo?

Gracias por todas las respuestas!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 14/05/2006 a las 12:46
  #9 (permalink)  
Antiguo 14/05/2006, 15:28
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
Ohhh, bueno, si estan ya en tu pc, entonces solo te faltaba linkearlas.
No recuerdo muy bien como hacerlo en linux, pero el chiste es que compilas tu programa sin linkearlo(checa las opciones de gcc si es que lo usas). Esto te produce un .o. Despues linkeas el .o con gd.a o gd.o(ha de ser ese) con el mismo gcc.
La verdad no estoy muy familiarizado con gcc en la linea de comandos de linux.
Pero esa es la idea.

Saludos
  #10 (permalink)  
Antiguo 15/05/2006, 01:26
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
He intentado linkear con gcc, pero me han seguido saliendo los mismos errores. Lo que he hecho es añadir (segun lo que he leido) un par de parametros mas, el -Iruta y el -Lruta, pero nada

No hace falta que sea con gcc! decidme como haceis vosotros para compilar en linux (o unix) Decidmelo paso a paso, porque realmente no tengo idea de como hacerlo bien

Gracias.
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #11 (permalink)  
Antiguo 15/05/2006, 06:43
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
A ver os he dejado tiempo porque creía que Instru ya había encontrado la solución, pero veo que no entiendes oskarL lo que Instru te trataba de decir.

Tienes main.c, gd.h y eso está bien.

Pero, ¿tienes la LIBRERÍA en sí? La librería no es gd.h, sino un archivo de nombre libgd o similar (.lib son para windows, Instru). Debes tener este archivo en /usr/lib, normalmente.
  #12 (permalink)  
Antiguo 15/05/2006, 07:16
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Pues si, si que existen varios ficheros similares a ese en /usr/lib/, por ejemplo...

libgd.a
libgd.so

libgdbm.a
libgdbm.la
libgdbm.so

libgd.so.2
libgd.so.2.0.0

...

y varios mas, por lo que deduzco que la libreria esta correctamente instalada... no?

Que debo hacer ahora? como es que me esta dando error al compilar?
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 15/05/2006 a las 15:04
  #13 (permalink)  
Antiguo 16/05/2006, 06:41
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Sí, en teoría sí.

Vamos a ver, dices que te da este error:

/tmp/cc006t47.o(.text+0x51): En la funcion 'main':
:undefined reference to 'gdImageCreateFromJpeg'

Pues abre el archivo gd.h y busca gdImageCreateFromJpeg.
  #14 (permalink)  
Antiguo 16/05/2006, 07:55
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Me da ese error, y muchos otros en referencia a varias funciones, si.

Basicamente el error es el mismo, solo que cambia la funcion por:

round
gdImageCreateTrueColor
floor
ceil
gdImageGetPixel
gdImageColorAllocate
gdImageSetPixel
gdImageJpeg

y todo esto repetido tantas veces como haya utilizado la funcion correspondiente en el programa, como es logico, jeje


El gd.h no es un fichero de librerias "corriente" (bajo mi punto de vista, jeje). Esta lleno de #define y he encontrado por internet que eso son "macros" y que se parece a las funciones, mas o menos...

En gd.h lo que unico que hay de gdImageCreateFromJpeg es esta linea:

BGD_DECLARE(gdImagePtr) gdImageCreateFromJpeg (FILE * infile);

Que parece que solamente es una declaracion. Lo mismo pasa con el resto de funciones (al menos las que empiezan por gd, porque el resto creo que son de math, no?)


La definicion de BGD_DECLARE esta en la primera parte del codigo...

Código:
#ifdef __cplusplus
extern "C" {
#endif

#ifndef GD_H
#define GD_H 1

/* Do the DLL dance: dllexport when building the DLL,
	dllimport when importing from it, nothing when
	not on Silly Silly Windows (tm Aardman Productions). */

/* 2.0.20: for headers */

/* 2.0.24: __stdcall also needed for Visual BASIC 
	and other languages. This breaks ABI compatibility
	with previous DLL revs, but it's necessary. */

/* 2.0.29: WIN32 programmers can declare the NONDLL macro if they
	wish to build gd as a static library or by directly including
	the gd sources in a project. */

#ifndef WIN32
#define NONDLL 1
#endif /* WIN32 */

#ifdef NONDLL
#define BGD_DECLARE(rt) extern rt
#else
#ifdef BGDWIN32
#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall
#else
#define BGD_DECLARE(rt) __declspec(dllimport) rt _stdcall
#endif /* BGDWIN32 */
#endif /* NONDLL */

...
...
...
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 16/05/2006 a las 08:20
  #15 (permalink)  
Antiguo 16/05/2006, 09:13
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 6 meses
Puntos: 52
Bueno, no se de donde sacas que no es "corriente". En si es una libreria bien escrita.
Ahora la que tu debes linkear es libgd.a. Para esto, en el gcc debes ponerle como argumento a la compilacion -lgd o -libgd (una de esas 2 es, SIN el .o o .a).

Eso debe funcionar.
Saludos
  #16 (permalink)  
Antiguo 16/05/2006, 09:49
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Decia que no es "corriente" bajo mi punto de vista, jeje. Vamos, que nunca habia visto una libreria asi.

A ver, he hecho un "whereis lgd" y no me ha dao ningun resultado, pero con "whereis libgd" si que ha encontrado archivos, asi que he decidido utilizar el segundo argumento, porque parece que si utilizo el primer argumento, estare intentando compilar con una libreria que no existe, me equivoco?


Pues bueno, escribiendo:

gcc -o imager2 imager2.c -libgd

me lanza este error:

/usr/bin/ld: no se puede encontrar -libgd
collect2: ld devolvio el estado de salida 1


Me temo lo peor, a que no tengo bien instaladas las librerias??
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #17 (permalink)  
Antiguo 16/05/2006, 13:19
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por oskarL
Decia que no es "corriente" bajo mi punto de vista, jeje. Vamos, que nunca habia visto una libreria asi.

A ver, he hecho un "whereis lgd" y no me ha dao ningun resultado, pero con "whereis libgd" si que ha encontrado archivos, asi que he decidido utilizar el segundo argumento, porque parece que si utilizo el primer argumento, estare intentando compilar con una libreria que no existe, me equivoco?


Pues bueno, escribiendo:

gcc -o imager2 imager2.c -libgd

me lanza este error:

/usr/bin/ld: no se puede encontrar -libgd
collect2: ld devolvio el estado de salida 1


Me temo lo peor, a que no tengo bien instaladas las librerias??
Pues no habrías visto ninguna, porque todas se "fabrican" de esa manera, o muy similar. xD

A ver, "lgd" no existe, eso le indica al compilador que use la opción "-l" (linkear) con la librería de nombre "gd", no "lgd".
  #18 (permalink)  
Antiguo 17/05/2006, 01:28
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
Bueno, estas son todas las ejecuciones que he ido probando y que me han dado exactamente los mismos errores que al principio

gcc -o imager2 imager2.c -Llibgd
gcc -o imager2 imager2.c -Ilibgd
gcc -o imager2 imager2.c -Lgd
gcc -o imager2 imager2.c -Igd



Y con estas ejecuciones me dice que no se ha podido encontrar...

gcc -o imager2 imager2.c -libgd
gcc -o imager2 imager2.c -llibgd




Con la siguiente me compila, aunque sospecho que lo hace mal, porque el programa no se ejecuta correctamente, y me devuelve siempre el valor 126 al ejecutarlo

gcc -o imager2 imager2.c -lgd



Con otras como estas, dice que no reconoce la linea de comando

gcc -o imager2 imager2.c -iibgd
gcc -o imager2 imager2.c -igd





Se que algunas ejecuciones son absurdas, pero he querido probar todas las "posibilidades", y mostraros que es lo que sucede, porque aun no me ha quedado muy claro que es lo que tengo que escribir exactamente, jeje

Gracias por toda la ayuda!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 17/05/2006 a las 03:22
  #19 (permalink)  
Antiguo 18/05/2006, 06:49
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por oskarL
Con la siguiente me compila, aunque sospecho que lo hace mal, porque el programa no se ejecuta correctamente, y me devuelve siempre el valor 126 al ejecutarlo

gcc -o imager2 imager2.c -lgd
No me entendiste: Es ésa la que es correcta.

"-lgd" lo que hace es buscar la librería de nombre "libgd".

Es decir, "-l" es la opción, "gd" el nombre de la librería, pero que en la partición (/usr/lib) se guarda con nombre "libgd" para diferenciar de otros archivos.

Así que... ¡Enhorabuena! :) Has logrado compilar. Como dijo alguien:

"Si compila, es algo bueno.
Si hace lo que debe, es perfecto".

Así que "sólo" te falta eso, tener un programa que funcione bien.
  #20 (permalink)  
Antiguo 18/05/2006, 07:05
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
No puede ser, no tiene ninguna logica, el codigo del programa funciona bien. Lo se porque Nivel7 consiguio compilarlo y hacerlo funcionar a la perfeccion. Le pase el codigo en otro post, y ese mismo codigo es el que estoy compilando en linux, asi que deberia funcionar... y no lo hace!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #21 (permalink)  
Antiguo 18/05/2006, 07:16
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años
Puntos: 2
RECTIFICO!!

No era el mismo codigo... Como bien me dijo Nivel7 en el otro post, me faltaba añadir un include de string.h, por eso era por lo que no me funcionaba.

Ahora ya va todo a la perfeccion!

Muchisimas gracias a todos por esta gran ayuda!! me habeis abierto los ojos en cuanto a c y a compilar en unix, aunque sea un poquito, jeje. Gracias de nuevo!! Os estare agradecido eternamente
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #22 (permalink)  
Antiguo 18/05/2006, 07:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Cita:
Iniciado por oskarL
No puede ser, no tiene ninguna logica, el codigo del programa funciona bien. Lo se porque Nivel7 consiguio compilarlo y hacerlo funcionar a la perfeccion. Le pase el codigo en otro post, y ese mismo codigo es el que estoy compilando en linux, asi que deberia funcionar... y no lo hace!
No lo discuto, pero las causas pueden ser distintas.

El caso es, que "-lgd" es como debes compilar.

Si te compila es que el código está bien, no hay nada "raro".

El enlazado es estático, que significa que todas las funciones han encontrado su "código", para que me entiendas. Quiere decir que el programa está completo.

Si no funciona es por otra cosa. Además, al ejecutarlo no te marca ningún error el sistema, simplemente devuelve ese número.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:25.