Identificarte

Versión Completa : Problema: enlazado librerías dinámicas


Sponsored links
.




Kurush_Ishraqi
mayo 17, 2008, 04:14
Buenas (estoy muy cansón hoy)!

He escrito mi primera librería, pero tengo un problema grande. Ella compila bien, y el enlazado con el programa principal también es correcto. Pero cuando intento ejecturar mi binario, me aparece el siguiente mensaje:

./dynsys-halvorsen.out
usuario@ubuntu:~$./programa.out: error while loading shared libraries: libusuario.so: cannot open shared object file: No such file or directory

Pues bien. Al hacer un ldd sobre el ejecutable, en efecto me dice que no sabe dónde está
libusuario.so. Pues busqué un poco, y lo que encontré fue que tenía que modificar el .bashrc para indicarle el camino directo a la librería. Pues lo que hice en el mencionado archivo fue agregar la siguiente línea

export LD_LIBRARY_PATH=/home/usuario ./programa.out

Y finalmente hice source ~/.bashrc

Sin embargo, y a pesar de que ya debería estarme reconociendo el lugar donde se encuentra la librería, el error sigue apareciendo. ¿Estaré haciendo algo mal? Bueno, muchas gracias por cualquier ayuda que pudieran darme.

Saludos.

snorlax123
mayo 17, 2008, 10:26
De hecho si esta haciendo varias cosas mal.. pero las vamos a corregir porque el fin es aprender

Para escribir un programa uno hace

Lenguaje C

1. Escribir codigo
2. Compilar
-Pre-procesamiento
-#include
-#if
-#define
-#ifndef
-#endif
-Lenguaje de maquina
3. Encadenar
-Ejecutables
-Librerias

Compilar ejecutable
gcc -c archivo.c
gcc -o salida entrada entrada2 entrada3
gcc -o ejecutable archivo.c //Hacerlo de 1
Compilar libreria estatica
ar rcs salida entrada.o
ar = crea libreria estatica
rcs = remueva todo lo innecesario
Nombrar funciones de libreria
nm libreria.a
Compilar librería Dinamica
gcc -c -fPIC archivo.c
gcc -shared -Wl, -soname,libsalida.so -o libsalida.so entrada.o
Listar librerias necesarias por un ejecutable
ldd nombreejecutable lista todas las librerias usadas por ese ejecutable

Aca esta algo que estaba haciendo mal:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:directoriodondees talalibreria

Encadenar librerias a ejecutable
g++ -Ldirectoriodondeestalalibreria -llibreria -o ejecutable entrada
Saber si mi codigo esta dentro de la libreria
nm libentrada.so | grep T

Recordar que

* Estandar POSIX comienza por lib y tiene extension .a (Libreria estatica)
* Estandar POSIX comienza por lib y tiene extension .so (Libreria dinamica)
* fPic, pone la ubicacion de la localizacion

Kurush_Ishraqi
mayo 18, 2008, 12:02
Hombre, muchas gracias por responderme!

Bueno, en efecto lo único que no estou haciendo es pre-compilación; pero aún me queda la pregunta...

el export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:directoriodondees talalibreriasí es correcto que lo introduzca en el archivo .bashrc? ¿O simplemente debo ejecutarlo desde consola?

Muy bien, y aprovechándote (oh yo, abusivo!), si la respuesta es afirmativa (debo ponerlo en la consola), ¿cómo hago para meterlo en un makefile?

Mi idea es hacer una función allí dentro que sea como

run:$(EJECUTABLE)
(tabuladora) export lalalalala
(tabuladora) ./$^

No sé cómo hacerlo; el makefile me pone el mensaje en la terminal (me pone export LD_etc), pero al parece no lo está ejecutando.

De nuevo, muchas gracias por tu ayuda :)