shared library und templates in Linux



  • Hallo,

    ich habe bisher in c++ programmiert und unter anderem templates verwendet. Größtenteils verwende ich meine eigene Bibliothek, die ich statisch einbinde.

    Eigentlich sollte es ja möglich sein, diese Bibliothek separat als shared library mittels "shared -fPIC -o libbiblio.so" zu compilieren.

    Dies würde den Zeitaufwand der Compilierung der vielen einzelnen Programme verringern. Die einzelnen Programmen laden sie dann nur hinzu.

    Was passiert aber mit templates? Wenn z.B. vom Programm ein template eines bestimmten Typs benutzt wird, dass sich vom Typ her garnicht in der shared library befindet?
    Muß ich dazu alle templates durch Funktionen ersetzen, die sich nur durch den Typ unterscheiden (function overload)?

    In den einschlägigen FAQs gibt es dazu nichts konkretes zu finden.

    Vielen Dank und Gruß
    Oliver



  • Auslagern der "Implementation" geht mit templates nicht.
    templates werden vom Compiler instantiiert und müssen deswegen sichtbar sein (und kosten deswegen auch Compilezeit).
    Einzige Möglichkeit: Du kannst die Implementierung weglassen und stattdessen eine Reihe von Spezialisierungen anbieten ... aber sobald ein anderer instantiierender Typ angegeben wird, muss der Anwender wieder selbst spezialisieren - was irgendwie den Sinn eines templates ad-absurdum führt.

    Hat weniger mit Linux als mehr etwas mit dem C++-Standard zu tun.

    Gruß,

    Simon2.



  • was moeglich sein duerfte ist folgendes:
    Du musst ja den Header mit deiner Templatedefinition auf jeden Fall liefern, falls ein Klient es fuer eine Klasse instatiieren will, fuer die du es noch nicht instatiert hast. Du kannst aber afaik durchaus haeufig benutzte Spezialisierungen in deine Bibliothek einbinden indem du sie explizit instatiierst, so dass sie fuer die Bilbio auf jeden Fall mit kompiliert werden. Dann noch diese Teile mit externer Linkage im template header deklarieren damit der Compiler weiss, dass er die Intantiierungen anderweitig findet (naemlich in der Bilbio). Ist alles nur ne Vermutung, die Gurus moegen mir verzeihen und mich berichtigen 😉

    //Libheader.h
    template <typename T>
    class Wumms {
    //...
    };
    
    extern template class Wumms<char>;
    extern template class Wumms<double>;
    
    //Lib translation unit
    #include Libheader.h
    template class Wumms<char>;   //explicit instantiation
    template class Wumms<double>; //explicit instantiation
    

    /edit: mir faellt grad auf dass extern fuer variablendeklarationen gilt, nicht fuer Klassendeklarationen. also in der Hinsicht inst meine Idee leider Humbug. Vielleicht gibts aber trotzdem eine derartige Loesung, vielleicht ueber das Schluesselwort "export" oder so?



  • pumuckl schrieb:

    /edit: mir faellt grad auf dass extern fuer variablendeklarationen gilt, nicht fuer Klassendeklarationen. also in der Hinsicht inst meine Idee leider Humbug. Vielleicht gibts aber trotzdem eine derartige Loesung, vielleicht ueber das Schluesselwort "export" oder so?

    Export wird afaik nur vom Comeau-Compiler unterstützt und der ist hier nicht so häufig anzutreffen ^^ und außerdem ist auch da export nicht besonders schön und export ist schon gar nicht performant eingearbeitet.
    Templateimplementierungen müssen einfach zur Compiletime vorliegen -.-.



  • Hallo,

    danke für die Antworten. Da muß ich erst mal rumexperimentieren.

    Gruß
    Oliver


Anmelden zum Antworten