========================================================= Zweites Mini-Beispiel zur Verwendung einer Shared-Library [TOC:2] ========================================================= Wir machen eine scheinbar kleiner Änderung: - Im Testprogramm `testit` wird nun eine Funktion `testit_msg()` definiert. - Es soll möglich sein, dass diese Funktion von den verwendeten Shared-Libraries aus aufgerufen wird. Dazu sind zwei Dinge notwendig: - Bei den Implementierungen der Shared-Libraries fügen wir eine Forward-Declaration hinzu. - Beim Übersetzen des Testprogrammes muss die Option `-rdynamic` verwendet werden. ---- SHELL (path=cpp-lecture,hide) ------------------------------ scp -r foo2_so lehn@thales: ----------------------------------------------------------------- Die abstrakte Klasse `Foo` ========================== Die abstrakte Klasse `Foo` bleibt unverändert. :import: cpp-lecture/foo2_so/foo.hpp Foo-Implementierung `FooHallo` ============================== Hier wurde die Forward-Declaration hinzugefügt. Zudem wird nun in der Methode `msg` zusätzlich die Funktion `testit_msg()` aufgerufen. :import: cpp-lecture/foo2_so/foo_hallo.cpp Erzeugen von `foo_hallo.so` --------------------------- ---- SHELL (hostname=lehn@thales,pathbase=./foo2_so) ------------ g++ -shared -fPIC -Wall -std=c++11 -o foo_hallo.so foo_hallo.cpp ----------------------------------------------------------------- Foo-Implementierung `FooWelt` ============================= Analog wird die Implementierung von `FooWelt` geändert: :import: cpp-lecture/foo2_so/foo_welt.cpp Erzeugen von `foo_welt.so` -------------------------- ---- SHELL (hostname=lehn@thales,pathbase=./foo2_so) ------------ g++ -shared -fPIC -Wall -std=c++11 -o foo_welt.so foo_welt.cpp ----------------------------------------------------------------- Das Test-Programm ================= Hier wurde nur die Funktion `testit_msg()` hinzugefügt: :import: cpp-lecture/foo2_so/testit.cpp Ausführen und Übersetzen des Test-Programmes mit `-rdynamic` ============================================================ ---- SHELL (hostname=lehn@thales,pathbase=./foo2_so) ------------ g++ -Wall -rdynamic -std=c++11 -o testit testit.cpp ./testit ./foo_hallo.so ./testit ./foo_welt.so ----------------------------------------------------------------- Fehlermeldung, wenn das Test-Programmes ohne `-rdynamic` übersetzt wird ======================================================================= Eine Fehlermeldung wird zur Laufzeit erzeugt, wenn aus einer Shared-Library heraus versucht wird, eine Funktion in `testit` aufzurufen: ---- SHELL (hostname=lehn@thales,pathbase=./foo2_so) ------------ g++ -Wall -std=c++11 -o testit testit.cpp ./testit ./foo_hallo.so ./testit ./foo_welt.so ----------------------------------------------------------------- :navigate: up -> https://www.uni-ulm.de/mawi/mawi-numerik/lehre/wintersemester-20162017/vorlesung-objektorientierte-programmierung-mit-c/ back -> doc:cpp-lecture/foo_so/index