• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

eigene shared library erstellen und benutzen

borgg

Newbie
Hallo,

ich stehe gerade sehr auf dem Schlauch. Ich möchte unter c/c++ eine eigene shared library erstellen und dann logishcerweise nutzen.

Umgebung: suse10.3, Eclipse+CDT,

So weit so gut. Lib geschrieben und compiliert. Heraus kommt eine "libtestlib.so". Nun soll diese natürlich in ein anderes Programm eingebunden werden. Also setzte ich im Programmprojekt einen Linker pfad in das (in diesem falle) debug verzeichnis des Library projektes. Mein Programm, das die lib verwenden soll compiliert auch. Auch der Linker meckert nicht. Lösche ich spaßenshalber die "libtestlib.so" kriegt er ne Kriese. Daher gehe ich davon aus, dass er sie da gefunden hat und auch ordentlich linkt.

Wenn ich es jedoch starten will sagt er _immer_

"error while loading shared libraries: libtestlib.so: cannot open shared object file: No such file or directory".

Es ist völlig gleich wo ich die .so Datei hin schreibe.
a) /usr/local/lib (als admin einfach hinkopiert, und hat selbe Zugriffsrechte (-rwxr-xr-x)
b) direkt ins verzeichnis wo die binary des programms ist, zu der die lib dazu gelinkt wurde.

...immer der selbe fehler.

Andere libs die in z.B. /usr/local/lib stehen können problemlos verwendet werden. Da kommt kein Fehler.

Irgendjemand eine Idee was ich da falsch mache? Muss irgendwas sehr einfaches sein.

Danke
 

oxe1976

Member
Hi,

Du linkst wahrscheinlich mit:
Code:
... -L/path/to/library -ltestlib ...

Du musst bekannt geben wo die Library zu finden ist, das kann man z.B. ueber die environment variable LD_LIBRARY_PATH anstellen:

Code:
export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH

Mit ldd kannst Du uebrigens sehen, welche Libraries benoetigt werden und welche genommen werden:

Code:
ldd <executable>

Es gab auch noch die Moeglichkeit beim linken den pfad mit reinzulinken (irgendwas mit -rpath).
 
OP
B

borgg

Newbie
oxe1976 schrieb:
Hi,

Du linkst wahrscheinlich mit:
Code:
... -L/path/to/library -ltestlib ...
richtig

oxe1976 schrieb:
Du musst bekannt geben wo die Library zu finden ist, das kann man z.B. ueber die environment variable LD_LIBRARY_PATH anstellen:
Code:
export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
Wenn ich die Datei in /usr/local/lib habe sollte die doch eh gefunden werden oder? Ich meine, wie findet er sonst die anderen Libs die da rum liegen!? Oder versteh ich da was falsch?

oxe1976 schrieb:
Mit ldd kannst Du uebrigens sehen, welche Libraries benoetigt werden und welche genommen werden:
Code:
ldd <executable>
Das hab ich schon getan. Da sagt er mir dann auch, "=> not found"
 

oxe1976

Member
borgg schrieb:
Wenn ich die Datei in /usr/local/lib habe sollte die doch eh gefunden werden oder? Ich meine, wie findet er sonst die anderen Libs die da rum liegen!? Oder versteh ich da was falsch?

Nach dem kopieren musst Du ldconfig ausfuehren um die run time bindings herzustellen. Siehe z.B. auch: http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

borgg schrieb:
Das hab ich schon getan. Da sagt er mir dann auch, "=> not found"

Sollte gefunden werden, wenn Du entweder die LD_LIBRARY_PATH variante benutzt oder ldconfig ausgefuehrt hast.

Gruss
 
Oben