Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]dll metodo microsoft(__dllexport)e template

    ciao.
    Sto utilizzando un programma xsd open source per generare sorgenti di classi c++ da un xsd.
    Il mio problema adesso è che ho dovuto inserire un wrapper template del tipo:
    template<class T>
    class wrapper : public T
    {
    //implementazione membri da aggiungere
    }

    per inserire delle funzioni in particolare per poter utilizzare il pattern visitor.
    Ogni classe(sono 2000) viene "avvolta" da questo wrapper che implementa delle funzioni comuni, ad es acceptVisitor.
    Il problema adesso è che se compilo una static library tutto va correttamente, ma se cerco di creare una dll escono i problemi, il compilatre mi dice che non è possibile nella definizione di alcuni tipi con typedef ,mi rendo conto che è un po poco come indizio, ma vorrei capire la base del problema che ho esposto sotto, poi magari mi arrangio.

    Adesso che ci penso non ho inserito __dllexport prima del wrapper template.
    puo essere quello il problema?

    Inoltre ed è la domanda principale:
    come ci si deve comportare per esportare una classe template in una dll?
    ho letto su un blog che è "pericoloso" esportare classi con funzioni che hanno dei parametri template ad es quelli della stl tipo il std::string, è vero?
    perchè?
    è la stessa cosa per tutti i template?
    si risolvono tutti i problemi usando una static library?

    grazie.

    ps.
    per Mitaly:
    Ho capito perchè ridevi quando cercavo di compilare un file di classi template da 30 Mb(un cxx che viene espanso).
    nel programma c'era un parametro per suddividere il file in "pezzi" da un tot di MB ha risolto perfettamente.

    ciao.

  2. #2
    Il punto è che non puoi esportare un template in una dll, dato che un template non è codice che viene compilato, ma un generatore di codice, usato a compile-time per generare il codice che verrà poi compilato. Ergo, se vuoi fornire dei template li devi dare sotto forma di header, non di dll.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    Ho pero' provato a generare una lib statica e sembra funzionare , anche se tiene 130 mb.
    L'eseguibile compilato invece ha delle dimensioni normali 6 / 10 Mb, è corretto?
    perchè da un file di 130 mb ho un eseguibile cosi ridotto?
    è questione di linking?
    grazie.

  4. #4
    Le librerie statiche sono semplicemente una collezione di moduli oggetto, per cui, da quanto ne so, normalmente non possono contenere template non istanziati, per i quali il compilatore poi dovrà comunque ricorrere ai file .h. Le grosse dimensioni delle librerie statiche solitamente sono normali, dato che si tirano dietro metadati aggiuntivi (usati poi dal linker) e devono contenere effettivamente tutte le funzioni definite nei sorgenti, senza poter rimuovere quelle che non vengono effettivamente utilizzate (dato che potrebbero essere invece utilizzate nel programma finale che sarà linkato con la libreria).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    quindi da quanto ho capito non mi devo tirare dietro la libreria come invece si fa per le dll, l'eseguibile dopo la fase di linking ha tutto cio che gli serve.
    è corretto Mitaly?
    ciao

  6. #6
    Esattamente; una libreria statica di fatto è l'esito di una "mezza compilazione", in cui vengono generati tutti i moduli oggetto del codice in questione, ma il linking è rimandato a quando ci saranno anche i moduli oggetto dell'applicazione vera e propria. Una volta compilata e linkata l'applicazione, il codice della libreria che le serve è già completamente incluso nell'eseguibile generato.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.