Tebau
26/10/2008, 14:21
Hola a todos.
Tengo un problema que me tiene bastante mosqueado. Estoy reaprendiendo a programar en C, pero ahora bajo sistemas UNIX (a la vez estoy aprendiendo a usar la consola de Linux). Un amigo me aconsejó un manual en linea que es el que estoy siguiendo.
Muy al principio del manual explican cómo hacer una biblioteca estática y una compartida. Con la estática no hay problema, todo sale bien, pero al intentar compilar un programa de prueba con la compartida, me da un error. Pongo paso por paso lo que he hecho, por si alguien detecta el error:
En primer lugar, creé una carpeta para los archivos que fuera generando el manual. Fue la carpeta "/home/tebau/Documentos/Curso_C".
Como ejemplo de biblioteca, creamos una con dos funciones, una que calcula el cubo de un real y otra para calcular el factorial de un natural:
float cubo(float x)
{
return (x*x*x);
}
int factorial(int n)
{
int i, res=1;
for(i=1; i<=n; i++)
res*=i;
return (res);
}
Implementé cada una de las funciones por separado (con el vi) en los archivos "cubo.c" y "factorial.c".
Ahora creé (también con el vi) el archivo de cabecera de la biblioteca: "libmm.h":
extern float cubo(float);
extern int factorial(int);
El siguiente paso fue implementar un programa para probar la biblioteca:
/* Programa prueba.c */
#include "libmm.h"
#include "stdio.h"
#define VALOR 4
main()
{
printf("El cubo de %d es %f\n",VALOR, cubo(VALOR) );
printf("\t y su factorial es %d\n",factorial(VALOR) );
}
Llegado a este punto, aun no había compilado nada. Lo primero fue compilar las funciones para obtener su código objeto:
$ gcc -c cubo.c factorial.c
Obtuve los archivos "cubo.o" y "factorial.o" en la misma carpeta "Curso_C". Ahora creé e indexé la biblioteca estática "libmm.a":
$ar rs libmm.a cubo.o factorial.o
Creé dos carpetas locales: una para las bibliotecas ("lib"), en la que metí la biblioteca "libmm.a" y otra para las cabeceras ("include"), en la que metí su cabecera "libmm.h":
$ mkdir ../include
$ mkdir ../lib
$ mv libmm.h ../include
$ mv libmm.a ../lib
Ahora compilo finalmente el programa de prueba, incluyendo la biblioteca:
gcc -I../include -L../lib -o prueba1 prueba.c -lmm
Todo salió bien, y al ejecutar el programa me dió la salida esperada. Ahora intenté hacer la biblioteca compartida, y falló. Seguí los siguientes pasos:
Primero introduzco en la consola este comando, que no sé para qué sirve, pero me dice que debo hacerlo:
$ gcc -c -fPIC cubo.c factorial.c
Ahora genero la biblioteca, con el nombre "libmm.so":
$ gcc -shared -o libmm.so cubo.o factorial.o
Me dice el manual que mueva la nueva biblioteca a la carpeta de bibliotecas:
mv libmm.so ../lib
Compilo el programa de prueba, usando esta vez la biblioteca compartida:
$ gcc -I../include -L../lib -o prueba prueba.c -lmm
Lo compila correctamente. Obtengo un archivo "prueba2" en el directorio "Curso_C". Y ahora llega el problema: ejecuto y obtengo el siguiente mensaje:
$ ./prueba2
./prueba2: error while loading shared libraries: libmm.so: cannot open shared object file: No such file or directory
:?
Pero en la carpeta "lib" está el archivo "libmm.so". Si ejecuto:
$ ls ../lib
libmm.a libmm.h
La carpeta "lib" además está colgando del arbol de directorios exáctamente al mismo nivel que la carpeta en la que estoy trabajando. Pero si ejecuto el comando
ldd prueba2, me dice que no ha encontrado "libmm.so" :???:.
¿Alguien tiene alguna idea de por dónde puede ir el problema?
Muchas gracias.
Tengo un problema que me tiene bastante mosqueado. Estoy reaprendiendo a programar en C, pero ahora bajo sistemas UNIX (a la vez estoy aprendiendo a usar la consola de Linux). Un amigo me aconsejó un manual en linea que es el que estoy siguiendo.
Muy al principio del manual explican cómo hacer una biblioteca estática y una compartida. Con la estática no hay problema, todo sale bien, pero al intentar compilar un programa de prueba con la compartida, me da un error. Pongo paso por paso lo que he hecho, por si alguien detecta el error:
En primer lugar, creé una carpeta para los archivos que fuera generando el manual. Fue la carpeta "/home/tebau/Documentos/Curso_C".
Como ejemplo de biblioteca, creamos una con dos funciones, una que calcula el cubo de un real y otra para calcular el factorial de un natural:
float cubo(float x)
{
return (x*x*x);
}
int factorial(int n)
{
int i, res=1;
for(i=1; i<=n; i++)
res*=i;
return (res);
}
Implementé cada una de las funciones por separado (con el vi) en los archivos "cubo.c" y "factorial.c".
Ahora creé (también con el vi) el archivo de cabecera de la biblioteca: "libmm.h":
extern float cubo(float);
extern int factorial(int);
El siguiente paso fue implementar un programa para probar la biblioteca:
/* Programa prueba.c */
#include "libmm.h"
#include "stdio.h"
#define VALOR 4
main()
{
printf("El cubo de %d es %f\n",VALOR, cubo(VALOR) );
printf("\t y su factorial es %d\n",factorial(VALOR) );
}
Llegado a este punto, aun no había compilado nada. Lo primero fue compilar las funciones para obtener su código objeto:
$ gcc -c cubo.c factorial.c
Obtuve los archivos "cubo.o" y "factorial.o" en la misma carpeta "Curso_C". Ahora creé e indexé la biblioteca estática "libmm.a":
$ar rs libmm.a cubo.o factorial.o
Creé dos carpetas locales: una para las bibliotecas ("lib"), en la que metí la biblioteca "libmm.a" y otra para las cabeceras ("include"), en la que metí su cabecera "libmm.h":
$ mkdir ../include
$ mkdir ../lib
$ mv libmm.h ../include
$ mv libmm.a ../lib
Ahora compilo finalmente el programa de prueba, incluyendo la biblioteca:
gcc -I../include -L../lib -o prueba1 prueba.c -lmm
Todo salió bien, y al ejecutar el programa me dió la salida esperada. Ahora intenté hacer la biblioteca compartida, y falló. Seguí los siguientes pasos:
Primero introduzco en la consola este comando, que no sé para qué sirve, pero me dice que debo hacerlo:
$ gcc -c -fPIC cubo.c factorial.c
Ahora genero la biblioteca, con el nombre "libmm.so":
$ gcc -shared -o libmm.so cubo.o factorial.o
Me dice el manual que mueva la nueva biblioteca a la carpeta de bibliotecas:
mv libmm.so ../lib
Compilo el programa de prueba, usando esta vez la biblioteca compartida:
$ gcc -I../include -L../lib -o prueba prueba.c -lmm
Lo compila correctamente. Obtengo un archivo "prueba2" en el directorio "Curso_C". Y ahora llega el problema: ejecuto y obtengo el siguiente mensaje:
$ ./prueba2
./prueba2: error while loading shared libraries: libmm.so: cannot open shared object file: No such file or directory
:?
Pero en la carpeta "lib" está el archivo "libmm.so". Si ejecuto:
$ ls ../lib
libmm.a libmm.h
La carpeta "lib" además está colgando del arbol de directorios exáctamente al mismo nivel que la carpeta en la que estoy trabajando. Pero si ejecuto el comando
ldd prueba2, me dice que no ha encontrado "libmm.so" :???:.
¿Alguien tiene alguna idea de por dónde puede ir el problema?
Muchas gracias.