PDA

Ver la versión completa : Creación de una biblitea compartida para C en Linux



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&#40;i=1; i<=n; i++&#41;
res*=i;
return &#40;res&#41;;
&#125;

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&#40;float&#41;;
extern int factorial&#40;int&#41;;

El siguiente paso fue implementar un programa para probar la biblioteca:


/* Programa prueba.c */
#include "libmm.h"
#include "stdio.h"
#define VALOR 4

main&#40;&#41;
&#123;
printf&#40;"El cubo de %d es %f\n",VALOR, cubo&#40;VALOR&#41; &#41;;
printf&#40;"\t y su factorial es %d\n",factorial&#40;VALOR&#41; &#41;;
&#125;


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&#58; error while loading shared libraries&#58; libmm.so&#58; cannot open shared object file&#58; 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.

Pantalàimon_
27/10/2008, 02:41
Hola Tebau, yo soy muy principiante con esto del C. Lo que te puedo recomendar un foro donde lo más seguro obtengas solución a tu problema.

http://www.elrincondelc.com/nuevorincon/foros/

Espero que te sirva de ayuda :h:

gdl
27/10/2008, 12:36
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" :???:.


Hay por ahí una variable de entorno que le dice al cargador dónde busar las bibliotecas compartidas. El directorio actual (el .) creo recordar que no viene por defecto en esa variable de entorno. Desafortunadamente hace muchos años que no toco el Linux y no recuerdo el nombre de la variable de entorno susodicha. :s:

MiGUi
27/10/2008, 13:24
./prueba2: error while loading shared libraries: libmm.so: cannot open shared object file: No such file or directory

Eso es porque no te encuentra la librería en el LD_LIBRARY_PATH.

Métela en /lib64 o en /lib.