Domanda

Ho un messaggio di errore davvero strano che si verifica solo quando aggiungo la seguente riga al mio progetto:

std::list<CRect> myVar;

Vale la pena notare che non deve essere un elenco std ::, può essere std :: vector o qualsiasi altro contenitore STL presumo.

Ecco il messaggio di errore:

  

Errore 1 errore LNK2005: " pubblico:   __thiscall std :: list

     
    

:: list > (void) "     (?? 0? $ @ Lista VCRect @@ V? $ @ Allocatore VCRect @@@ @@@ std std @@ QAE @ XZ)     già definito in     SomeLowLevelLibrary.lib

  

La libreria di basso livello a cui fa riferimento il messaggio di errore non ha idea del progetto che sto realizzando, ha solo funzionalità di base di basso livello e non si occupa di GUI MFC di alto livello.

Posso far scomparire l'errore del linker se cambio la riga di codice in:

std::list<CRect*> myVar;

Ma non voglio hackerarlo per il gusto di farlo.

Inoltre, non importa se creo la variabile nello stack o nell'heap, ottengo sempre lo stesso errore.

Qualcuno ha qualche idea al riguardo? Sto utilizzando Microsoft Visual Studio 2008 SP1 su Vista Enterprise.

Modifica: L'errore linker sopra è per lo std :: list < > costruttore, ricevo anche un errore per il distruttore, _Nextnode e le funzioni clear.

Modifica: in altri file nel progetto, std :: vector non si collega, in altri file potrebbe essere std :: list. Non riesco a capire perché alcuni contenitori funzionino e altri no. Il collegamento MFC è statico in entrambe le librerie. Nella libreria di basso livello abbiamo 1 classe che eredita da std :: list.

Modifica: la libreria di basso livello non ha classi ereditate da CRect, ma utilizza STL.

È stato utile?

Soluzione 2

Di recente mi sono imbattuto di nuovo in questo errore nel nostro progetto e ho deciso di fare un'indagine più approfondita rispetto al solo aggiustarlo con un hack come l'ultima volta (scambia std :: list per CArray). Si scopre che una delle nostre librerie di basso livello ereditava da std :: list, ad esempio

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

Questa non è solo una cattiva pratica, ma è stata anche la causa degli errori del linker nell'applicazione principale. Cambio CRectList per racchiudere std :: list anziché ereditarlo e l'errore è scomparso.

Altri suggerimenti

Dovresti guardare le impostazioni del linker, ma non posso dire immediatamente quale. È normale che le istanze STL vengano eseguite in più file. Il linker dovrebbe sceglierne uno. Sono tutti identici (supponendo che tu abbia impostazioni di compilazione coerenti).

Questo non suona come il sintomo esatto, ma per essere sicuri devi controllare che il tuo progetto principale e tutte le librerie incluse utilizzino la stessa "Libreria di runtime" impostazione in " C ++: Generazione di codice " ;. La miscelazione di queste impostazioni può creare errori di collegamento alla libreria di runtime. (Ciò che mi confonde nel tuo caso è che puoi farlo sparire cambiando il codice, ma vale la pena controllare se non l'hai già fatto.)

SomeLowLevelLibrary.lib contiene o utilizza classi denominate CRect? Utilizza STL?

Il file è incluso in un'intestazione che potrebbe essere compilata in due moduli di codice separati?

Un'altra possibilità casuale mi è venuta in mente oggi. È possibile che la tua attuale DLL e libreria di basso livello facciano riferimento a due diverse versioni di MFC? Tiro lungo.

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