shared libs in C++

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

shared libs in C++

Beitrag von Duff » 13.03.2009 14:58:36

Hallo,

ich versuche gerade eine einfache shared libary bzw. dynamsiche Bibliothek zu erstellen. Doch leider scheine ich was falsch zu machen.

Meine beiden Dateien (Bibliothek und Aufrufprogramm):

Code: Alles auswählen

// libhello.cpp
#include <iostream>
using namespace std;

void print_hello() {
	cout << "Hello!" << endl;
}

Code: Alles auswählen

// usehello.cpp
void print_hello();

int main() {
	print_hello();
}
Bin anschließend so vorgegangen:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ g++ -fPIC -c libhello.cpp 
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ g++ -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ld -sf libhello.so.0.0 libhello.0
ld: unrecognized option '-sf'
ld: use the --help option for usage information
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ll
insgesamt 20
-rw-r--r-- 1 daniel daniel  109 13. Mär 14:50 libhello.cpp
-rw-r--r-- 1 daniel daniel 2440 13. Mär 14:51 libhello.o
-rwxr-xr-x 1 daniel daniel 6903 13. Mär 14:52 libhello.so.0.0
-rw-r--r-- 1 daniel daniel   68 13. Mär 14:51 usehello.cpp 
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ln -sf libhello.so.0.0 libhello.so.0
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ln -sf libhello.so.0 libhello.so
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ g++ usehello.cpp -L. -lhello
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ls -lrt
insgesamt 28
-rw-r--r-- 1 daniel daniel  109 13. Mär 14:50 libhello.cpp
-rw-r--r-- 1 daniel daniel   68 13. Mär 14:51 usehello.cpp
-rw-r--r-- 1 daniel daniel 2440 13. Mär 14:51 libhello.o
-rwxr-xr-x 1 daniel daniel 6903 13. Mär 14:52 libhello.so.0.0
lrwxrwxrwx 1 daniel daniel   15 13. Mär 14:53 libhello.so.0 -> libhello.so.0.0
lrwxrwxrwx 1 daniel daniel   13 13. Mär 14:53 libhello.so -> libhello.so.0
-rwxr-xr-x 1 daniel daniel 6924 13. Mär 14:54 a.out
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ./a.out 
./a.out: error while loading shared libraries: libhello.so.0: cannot open shared object file: No such file or directory
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ g++ usehello.cpp -L. -lhello -o usehello
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ll
insgesamt 36
-rwxr-xr-x 1 daniel daniel 6924 13. Mär 14:54 a.out
-rw-r--r-- 1 daniel daniel  109 13. Mär 14:50 libhello.cpp
-rw-r--r-- 1 daniel daniel 2440 13. Mär 14:51 libhello.o
lrwxrwxrwx 1 daniel daniel   13 13. Mär 14:53 libhello.so -> libhello.so.0
lrwxrwxrwx 1 daniel daniel   15 13. Mär 14:53 libhello.so.0 -> libhello.so.0.0
-rwxr-xr-x 1 daniel daniel 6903 13. Mär 14:52 libhello.so.0.0
-rwxr-xr-x 1 daniel daniel 6924 13. Mär 14:54 usehello
-rw-r--r-- 1 daniel daniel   68 13. Mär 14:51 usehello.cpp
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++/Kapitel06$ ./usehello 
./usehello: error while loading shared libraries: libhello.so.0: cannot open shared object file: No such file or directory
Jemand eine Idee was ich hier falsch mache?
Oh, yeah!

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: shared libs in C++

Beitrag von Spasswolf » 13.03.2009 15:04:43

Der dynamische Linker sucht doch nicht im aktuellen Verzeichnis, mehr in "man ld.so":

Code: Alles auswählen

LD_LIBRARY_PATH=. ./a.out

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: shared libs in C++

Beitrag von Duff » 13.03.2009 15:16:19

Sorry, aber verstehe ich jetzt nicht ganz.


Ich möchte doch eine ausführbare Datei (usehello) haben, die auf die Libary libhello.cpp zugreift.
(Bin noch beim Erlernen von C++, Linker und Bibliotheken)
Oh, yeah!

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: shared libs in C++

Beitrag von Spasswolf » 13.03.2009 15:25:36

Dann halt

Code: Alles auswählen

LD_LIBRARY_PATH=. ./usehello
Wnn du ein Programm das shared Libraries verwendet startest, werden die Libraries erstmal nur aus den in /etc/ld.so.cache gespeicherten und den unterhalb von /lib und /usr/lib liegen gesucht.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: shared libs in C++

Beitrag von Duff » 13.03.2009 15:42:02

Ok, ich glaube dass war's:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++$ ld Kapitel06/libhello.so
ld: warning: cannot find entry symbol _start; not setting start address
daniel@daniel-laptop:~/scripts/C++/Einstieg_in_C++$ ./hello 
Hello!
Danke.
Oh, yeah!

Antworten