Domanda

Ho una libreria statica scritto in C++ e ho una struttura che descrive il formato dei dati, vale a dire

struct Format{
    long fmtId;
    long dataChunkSize;
    long headerSize;

    Format(long, long, long);

    bool operator==(Format const & other) const;
};

Alcuni dei formati di dati sono ampiamente utilizzati, come {fmtId=0, dataChunkSize=128, headerSize=0} e {fmtId=0, dataChunkSize=256, headerSize=0}

Alcuni dati struttura di classi di ricevere in formato costruttore.Mi piacerebbe avere una sorta di scorciatoie per quelli formati più usati, come un paio di global Format i membri gFmt128, gFmt256 che posso passare per riferimento.Crea un'istanza di loro in una .file cpp come

Format gFmt128(0, 128, 0);

e in .h c'è

extern Format gFmt128;

inoltre, dichiaro Format const & Format::Fmt128(){return gFmt128;} e provare a usarlo nel modulo principale.

Ma se provo a farlo nel modulo principale che utilizza la lib, il linker si lamenta esterni non risolti gFmt128.

Come posso rendere la mia libreria di 'esportare' quelle variabili globali, in modo che posso usare da altri moduli?

È stato utile?

Soluzione

Non usare la parola chiave static sulle dichiarazioni globali. Ecco un articolo che spiega la visibilità delle variabili con/senza statico.La statica dà globals collegamento interno, che è visibile solo con l'unità di traduzione sono dichiarati.

Altri suggerimenti

Sono definiti .cpp file?Circa, dovrebbe apparire come:

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }

È necessario dichiarare il vostro Formato di oggetti come extern non statico

Morhveus, ho provato questo fuori, troppo. Il mio linker invece ha dichiarato di la gFmt128 simbolo già definito.Questo infatti, è il comportamento che mi aspetterei:il compilatore aggiunge la funzione di corpo sia per la biblioteca e l'oggetto client in quanto è definito nel file di inclusione.

L'unico modo per ottenere esterni non risolti è da

  • non aggiungere la libreria statica di oggetti-per-essere-linked
  • non si definisce il simbolo gFmt128 in libreria statica del file di origine

Io sono perplessa...Come mai si vede qualcosa di diverso?Puoi spiegare cosa succede?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top