c++ factory funktioniert nicht aus statischen libs heraus.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

c++ factory funktioniert nicht aus statischen libs heraus.

Beitrag von lisan » 15.12.2004 07:32:44

Hallo,

Ich habe eine Factory, welche sehr gut funktioniert insofern sich nicht klassen registrieren, welche in unterverzeichnissen des projektes liegen und als statische lib x.a beim linken hinzugefuegt werden.

Die Factory arbeitet im prinzip wie folgt:
Es gibt ein Makro

Code: Alles auswählen

#define REGISTER_ELEMENT(Class, Tag) \
Registrar<Class> Class##Registrar(Tag);
welches ein globales attribut/variable erstellt vom typen eines templates<CLASS> ->

Code: Alles auswählen

template <class T>
class Registrar
{
        public:
                Registrar( const std::string &tag )
                {
                        FactoryElement::Factory::self().announce( &factoryFn, tag );
                }

                static FactoryElement *factoryFn()
                {
                        return new T;
                }
};
D.h. sobald ich dieses makro auf eine klasse aufrufe springt der konstruktor an.
Das klappt niemals, wenn diese variablen in .a libs liegen - wieso ?

D.h.

Registrar<Rectangle> bar in test.o
fuehrt zum aufrufen des konstruktors Foo sobald ich das programm starte, da bar eine globale variable ist.

Liegt dieselbe Variable in einer .a -lib passiert das nicht - erst wenn ich irgendwo einmal eine Variable der Klasse Rectangle erstelle - ala.

Rectangle rect;


Wieso ist das so ?

Was will ich erreichen ? Ich moechte statische libs dazulinken oder nicht, je nach bedarf - d.h. ich moechte den kunden nicht mit allen funktionien ausstatten.
Dazu bedarf es einer faktory, welche klassen dynamisch erstellen kann.

Gruss,
Arvid.

p.s. ich sehe im uebrigen, betrachte ich die .a libs und die .o, dass diese variablen durchaus vorhanden sind. Nur werden die konstruktoren der variablen in den .a's nicht zum programmstart aufgerufen obwohl sie global sind.

Benutzeravatar
bollin
Beiträge: 482
Registriert: 01.11.2003 23:31:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von bollin » 15.12.2004 10:03:46

An sich sollte das gehen. Um den Fehler zu finden müsstest du aber mal einen minimalen Quelltext liefern, der sich übersetzen und ausführen lässt.

Viele Grüße,
Torsten

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 15.12.2004 10:15:18

Ich habe jetzt statt statischer dynamische libs verwendet, das funktioniert.
Was is eigendlich der unterschied zu plugins - Ich muss ja, wenn ich mein tool gegen
eine lib linke es neu uebersetzen ala apache2 mit ssl support oder nich.

Gibts laufzeitnachteile von plugins gegenueber shared libs ?
@bollin Falls dich das vorherige problem noch interessiert kann ich dir einen test
zusammenbauen.

Benutzeravatar
bollin
Beiträge: 482
Registriert: 01.11.2003 23:31:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von bollin » 15.12.2004 16:13:16

Plugins sind shared libs, die zur Laufzeit mittels dlopen geladen werden. Brennend interessieren tut mich das Problem nicht. :)

Torsten

Antworten