PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Module unter Linux programmieren



solanum
06-06-2002, 21:43
Hallo,

ich muss für ein Schulprojekt ein Programm in C++ schreiben, dass es erlaubt, später programmierte Module zu laden. In einer Scriptsprache wie meinem anvertrauten PHP sollte dies kein Problem sein, doch wie verwirkliche ich das ganze bei einem kompilierten Programm? Ich kann schlecht Executables einbinden xD. Es geht nun auch besonders darum, dass das ganze unter Linux stattfinden soll. Binde ich also *.so - Dateien ein? Wenn ja: Wo finde ich Beispiele zu deren Aufbau und Kompilierung?

solanum

anda_skoa
06-06-2002, 22:14
Wir sprechen hier über Laden zur Laufzeit und zwar ohne das Programm neu zu starten, richtig?

Also Plugins.

Ist das reines C++ oder darfst du zB kdelibs verwenden?
Damit ginge es nämlich sehr einfach :D

Aber es geht natürlich auch ohne.

Du brauchst praktisch 3 Aufgabenbereiche.
1) Die Pluginschnittstelle, also das Interface, dass jedes Plugin zur Verfügung stellt, und das Interface, dass den Plugins zu Verfügung steht.
2) den Loader, der die Bibliothek lädt, das symbol auflöst und das Plugin erzeugt.
3) den Trader, also den Teil der die libray (das lib file) findet.

Wie sowas gemacht wird, kann man schön in den KDE sourcen sehen.
(1) Ist in dem Fall die interfaces im KParts namespace.
(2) ist der KLibLoader
(3) ist der KTrader

Alle zu finden im kdelibs Paket.

Um welche Art von Modulen geht es denn?
Ich meine, was müssen die können?

Ciao,
_

Lin728
07-06-2002, 16:23
hi!

1. Meinst du einfach, dass ein paar von euch C++-dateien schreiben und ihr dann das ganze kompiliert? Das ist nicht so schwer. Sowiet ich beim gcj (GNU-Java_compiler) weiß, dürfte aber beim GCC nicht anders sein, kann man die einzenen dateien mit g++ -c Test.cpp kompilieren. Für diese aufgabe kannst du aber auch eine integrierte Entwicklungsumgebung nehmen, wie z.B. Kdevelop.

2. Meinst du, dass ein paar von euch bereits kompilierte object-dateien zur verfügung stellen und du musst sie einbinden? Das geht einfach: Zuerst deine C++-Datei mit "g++ -c Test.cpp" kompiliren (gibt ne O-datei) und dann die o-Dateien deiner Freunde dazulinken. Diese müssen allerdings soweit ich weiß vom selben kompilier stimmt.
Linken geht so: "g++ -o Test Obj.o Obj2.o".

3. Meinst du dass dein Programm Biliotheken nachzuladen hat, wärend es startet.
1. Alle .o-dateien deiner Freunde in eine shared-library verwandeln. "g++ -shared -o lib.so XXX.o YYY.o"
2. Danach deine .so-Datei in ein Verzeichnis kopieren, wo sie der Linker auch findet (z.B. /usr/lib", oder den LD_LIBRARY_PATH setzen. Das geht so: "export LD_LIBRARY_PATH=/da/ist/meine/datei.so"
3. Jetzt deine datei mit der option "-c" kompilien und nacher einfach mit "-o" Linken.

Ich glaube halt, dass du Fall 1 meinst. Bei uns in der schule wird auch immer von Modulen gesprochen...

Mfg

anda_skoa
13-06-2002, 22:07
Vor ein paar Tagen wurde in cold.apps oder cold.system ein Link zu einem C++dlopen Minit howto gepostet.
Enthält die wesentlichen Sachen, die man dabei beachten muß:
http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html

Ciao,
_

TheDodger
14-06-2002, 09:16
Ich habe da auch noch etwas bekommen:

Dynamically Loaded C++/ELF Plugins for LINUX
www.jdkoftinoff.com/jdkelf.tar.gz (http://www.jdkoftinoff.com/jdkelf.tar.gz)

Beim kurzem überfliegen scheint es komplettes Framework zu sein.
Inkl. Beispielsourcen.

allerdings: ' Nov 24 1995 '

TheDodger
27-08-2002, 10:23
Ich habe hier ein komplexes Gebilde aus Plugins und MDIWindow.

Die Plugins werden beim Start verifiziert, geladen und bei bedarf wird in einem QWorkspace das entsprechende Plugin geladen.
Die Plugins sind relativ komplexe ui Files, die ich mit dem Designer erzeuge und von denen ich dann meine jeweilige (Arbeits)Klasse ableite.
Insgesammt funktioniert das Laden der Plugins schon zufriedenstellend, allerdings habe ich nur noch das Problem, das ich keinerlei Signale an die Plugins senden, oder Funktionen innerhalb der Plugins aufrufen kann.

Da das ganze ausschließlich unter QT laufen soll, hat wohl der Hinweis auf KParts keinen Sinn ;) (anda_skoa ;) )

B.

anda_skoa
03-09-2002, 10:50
Haben die Plugins eine gemeinsame Plugin Basisklasse, bzw. kann man sie auch eine gemeinsame Basis casten?

So etwas wie zB KParts::Plugin

Ciao,
_

TheDodger
03-09-2002, 17:27
Ja, haben sie ...
Wenn ich allerdings auf diese caste ... bekomme ich einen Pointer auf die ui Klasse, von dem ich die custom-Class ableite, also eine Ebene zu spät. und ein gegenteil von parent() gibt es nicht :)

anda_skoa
03-09-2002, 18:28
Hmm, die gemeinsame Basisklasse ist also irgendwie von QWidget abgeleitet, richtig?

Warum kannst du die gemeinsamen Methoden nicht dort rein tun?

Plugins haben im Normalfall ja das selbe Interface, sie implementieren es nur anders.

Vielleicht kannst du ein kruzes Beispiel posten, nur leere class Deklarationen, damit man die Heriachie sieht.

Ciao,
_

TheDodger
04-10-2002, 08:32
sorry, das ich hierzu so spät antworte, aber ich verliere langsam aber sicher den überblick über alles ...


Original geschrieben von anda_skoa
Hmm, die gemeinsame Basisklasse ist also irgendwie von QWidget abgeleitet, richtig?

nicht ganz, sondern eher von einer Pluginbasisklasse ...


Warum kannst du die gemeinsamen Methoden nicht dort rein tun?

Sind sie ja schon drin!


Vielleicht kannst du ein kruzes Beispiel posten, nur leere class Deklarationen, damit man die Heriachie sieht.


Ohhh ... das ganze ist etwas komplexer ... ein stück code wird da bestimmt nicht ausreichen.
Ich habe das ganze mal soweit minimiert, das man das als test kompilieren kann ... und hänge das mal dran.

leider muß man da noch vieles selber handeln, das Projekthandling habe ich mal aussen vor gelassen.

als erstes das plugin kompilieren, dann das reale projekt.
die plugins befinden sich in den verzeichnissen plugins/test*