PDA

View Full Version : [C/Linux] Creare ed usare librerie dinamiche


andbin
08-02-2006, 16:24
Ho bisogno di creare una libreria dinamica e visto che mi sembra di non averne mai fatte (in Linux, perché in Windows non ho problemi) ... sto facendo una semplice prova.
Sono in /tmp/test ed ho questi 2 sorgenti (sono stupidi ma è solo x prova):

prova.c
#include <stdio.h>

void prova (int a, int b)
{
printf ("%d\n", a*b);
}
app.c
#include <stdio.h>

void prova (int, int);

int main (void)
{
prova (10, 3);
return 0;
}
prova.c lo compilo con:
gcc -c -o prova.o prova.c
e poi con:
gcc -shared -Xlinker -soname -Xlinker libprova.so -o libprova.so prova.o
per ottenere una libprova.so

app.c lo compilo con:
gcc -c -o app.o app.c
e poi con:
gcc -L/tmp/test -lprova -o app app.o

L'eseguibile funziona solo se imposto la variabile LD_LIBRARY_PATH=/tmp/test, altrimenti mi viene segnalato che non riesce a trovare la libreria dinamica.
Nota bene: io ho bisogno poi di mettere la mia libreria dinamica in una directory qualunque e non necessariamente in una directory di sistema.

Cosa devo fare? È possibile evitare di dover impostare LD_LIBRARY_PATH?

Grazie. Sicuramente è una stupidaggine!

ilsensine
08-02-2006, 16:40
Nota bene: io ho bisogno poi di mettere la mia libreria dinamica in una directory qualunque e non necessariamente in una directory di sistema.

Se la directory "qualunque" non è nota a priori, non puoi fare altro che utilizzare LD_LIBRARY_PATH o /etc/ld.so.conf. Il loader non può trovare la libreria semplicemente invocando la sfera di cristallo ;)

Se la directory è "fissa" (ad es. decidi di mettere le tue librerie in /opt/mylibs), allora è sufficiente che quando fai il link del tuo eseguibile aggiungi
-Wl,--rpath=/opt/mylibs
Così facendo la (o le) directory indicata con --rpath sarà la prima ad essere esaminata dal loader; poi toccherà alle directory di sistema/ld_library_path ecc.

andbin
08-02-2006, 19:32
Se la directory "qualunque" non è nota a priori, non puoi fare altro che utilizzare LD_LIBRARY_PATH o /etc/ld.so.conf. Il loader non può trovare la libreria semplicemente invocando la sfera di cristallo ;) Io per directory "qualunque" non intendevo ovviamente una directory "a caso" o non nota ma una directory fissa e ben precisa ma non di sistema.

Se la directory è "fissa" (ad es. decidi di mettere le tue librerie in /opt/mylibs), allora è sufficiente che quando fai il link del tuo eseguibile aggiungi
-Wl,--rpath=/opt/mylibs
Così facendo la (o le) directory indicata con --rpath sarà la prima ad essere esaminata dal loader; poi toccherà alle directory di sistema/ld_library_path ecc.Infatti così funziona, mi era "sfuggito" il rpath.
Grazie mille per l'info!!!